Winkelfunktion und Kreisabschnitt Pixel-setzten

Gast #430835
Hallo,
ich suche nach einer Funktion in C die einen winkel und die Radien 
zweier Kreise und einen fixen Punkt übergeben bekommt, und daraus eine 
Linie mit dem winkel zwischen den beiden Kreisen Zeichnet.

ich weiß nicht wie klar das ist, deswegen das kleine jpg im anhang.

die basisfunktion soll natürlich setpixel(x,y,colour) sein.

ist recht speziell, hat jemand eine idee!? in der glcd library gibt es 
sowas nicht, und ganz trivial ist es auch nicht, wie mir scheint.

Dennis
#430843
Jetzt, mit dem Bild ist das klarer.

> und ganz trivial ist es auch nicht,
Das ist Trigonometrie auf einfachster Stufe

seien px/py die Koordinaten des inneren Punktes
      r1, r2 die Radien und
      a der Winkel (in Radianten!)

dann sind die Koordinaten des einen Endpunktes der Linie
    x1 = px + cos(a) * r1
    y1 = py + sin(a) * r1

die des anderen:
    x2 = px + cos(a) * r2
    y2 = py + sin(a) * r2

Alles was jetzt noch bleibt ist eine Linie von x1/y1 nach
x2/y2 zu zeichnen. Und dazu nimmt man einen Bresenham, wenn
deine Graphic Library nicht schon eine Linien-Funktion dafür
hat.
Gast #430845
wer gucken kann ist klar im vorteil.

und der gute Bresenham hat meiner meinung nach vorerst keine lösung für 
dieses spezielle problem, also meines erachtens nach. ich habe von ihm 
bisher funktionen zum schräge linien zeichnen und zum kreise zeichnen 
aufgenommen, aber es mag ja sein :-)

wo?

Dennis
Gast #430850
mal als denkanstoss :

xPixel = (UINT) xFest + (Rad * (    sin (2  PI  Phi));
yPixel = (UINT) yFest + (Rad * (1 - cos (2  PI  Phi));

wobei Rad der Radius, Phi der Winkel und xFest und yFest die 
Startkoordinaten. Mach das ganze zweimal und du kannst ne Linie 
zeichnen.
Das einzige Problem an der sache ist sin/cos. Die gibts standardmässig 
nur in float, aber mit Tabellen kann man da einiges machen ...
Gast #430853
...ich muss sagen, ich war sehr versteift auf die auslassung der 
funktionen cos() und sin() aber eine schöne lösung ist es allemal, etwas 
in Bresenham style gibts es nicht, oder!?

dennis

ps: ein weiterer problempunkt ist: das füllen von kreisen und kreis mit 
einer linienbreite von 2 pixeln..oder einstellbar.

kreis im kreis scheidet aus - gibt löcher...
#430857
> mal als denkanstoss :
>
> xPixel = (UINT) xFest + (Rad * (    sin (2  PI  Phi));
> yPixel = (UINT) yFest + (Rad * (1 - cos (2  PI  Phi));

Die Unterschiede zu meiner Formel erklären sich dadurch,
dass a priori nicht definiert ist, wo denn der 0-Punkt
des Systems liegt (links/oben, links/unten, ... ) und auf
welcher Achse denn 0° aufgetragen werden.
Allerdings kann man meist davon ausgehen, dass die X-Achse
waagrecht liegt. Dann wäre es gut für die X-Koordinate den
cos zu benutzen und für die y Achse den sin :-)
#430860
> ...ich muss sagen, ich war sehr versteift auf die auslassung der
> funktionen cos() und sin() aber eine schöne lösung ist es allemal, etwas
> in Bresenham style gibts es nicht, oder!?

Wie gross (in Pixel) wird denn das Ganze.
Wenn es nicht allzugross wird ( < 1000 Pixel), kann man für sin und
cos wunderbar Tabellen benutzen (1 Tabelle!, sin(a) = cos(a-90))

Gast #430874
ok .. ich gebs ja zu ...
bin jetzt davon ausgegangen das 0° in der mitte oben liegt (beispiel uhr 
: 12Uhr) das system im uhrzeigersinn dreht und das ein grafik-system 
verwendet wird bei dem X=0 links und Y=0 oben ist ...
Gast #430896
hab ich mir auch gedacht nach dem ich meinen post gepostet habe und 
gesehen hab das schon 2 andere leute was dazu geschrieben haben ... (bin 
einfach zu langsam *ggg)
aber jetzt sind ja alle klarheiten besetigt ... (oder so ähnlich ...)

gruß
rene

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.