Forum: Mikrocontroller und Digitale Elektronik Winkelfunktion und Kreisabschnitt Pixel-setzten


von Dennis (Gast)


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

von Dennis (Gast)


Angehängte Dateien:

Lesenswert?

das bild.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Bresenham lässt grüssen...

Und der Anhang fehlt...

von Karl H. (kbuchegg)


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.

von Dennis (Gast)


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

von Dennis (Gast)


Lesenswert?

@Karl heinz Buchegger

interessant... muss das mal eben überschauen...
Dennis

von TheMason (Gast)


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 ...

von Dennis (Gast)


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...

von Karl H. (kbuchegg)


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 :-)

von Karl H. (kbuchegg)


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))


von TheMason (Gast)


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 ...

von Karl H. (kbuchegg)


Lesenswert?

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.

von TheMason (Gast)


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

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
Noch kein Account? Hier anmelden.