Winkelfunktion und Kreisabschnitt Pixel-setzten

Gast #430835
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
...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
Lesenswert?
• ▲
▼
> 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
Lesenswert?
• ▲
▼
> ...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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.