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
Bresenham lässt grüssen... Und der Anhang fehlt...
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.
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
@Karl heinz Buchegger interessant... muss das mal eben überschauen... Dennis
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 ...
...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...
> 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 :-)
> ...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))
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 ...
TheMason wrote:
> ok .. ich gebs ja zu ...
No problem.
Ich wollte nur verhindern, dass Dennis sich frägt, warum die
Formeln ähnlich aber doch anders sind.
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.