www.mikrocontroller.net

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


Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dennis (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
das bild.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bresenham lässt grüssen...

Und der Anhang fehlt...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger

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

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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))


Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.