Forum: Mikrocontroller und Digitale Elektronik punkt innerhalb oder außerhalb vom Kreisabschnitt


von Uwe B. (derexponent)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich will einen virtuellen Drehknopf auf einem LCD programmieren,
der per Touch "gedreht" werden soll.

Beschreibung :
ich habe 12 Bilder von einem Drehknopf (in 12 Stellungen)
und der User soll per Touch den Drehnkopf in beide Richtungen
drehen können

im Moment prüfe ich auf 12 Quadratische Hitboxen am
Kreisumfang des Knopfes. Das ist aber etwas "hakelig"

besser wäre, wenn ich bestimmen könnte, welcher der 12
Kreisabschnitte vom Touch betätigt ist

in kurz :
ich suche ein Formel, die mir zurückgibt ob der Punkt x,y
innerhalb vom Kreisabschnitt liegt oder nicht (siehe Bild)

Gruss Uwe

von W.A. (Gast)


Lesenswert?

Uwe B. schrieb:
> ich suche ein Formel, die mir zurückgibt ob der Punkt x,y
> innerhalb vom Kreisabschnitt liegt oder nicht (siehe Bild)

Mach eine Transformation auf Zylinderkoordinaten und prüfe dann den 
Winkel.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

W.A. schrieb:
> Transformation auf Zylinderkoordinaten und prüfe dann den Winkel.
Und auch den Abstand...

von Uwe B. (derexponent)


Lesenswert?

W.A. schrieb:
> Mach eine Transformation auf Zylinderkoordinaten und prüfe dann den
> Winkel.

danke für den Tip,

leider war Mathe noch nie meine Stärke :-)

die Formeln die ich zu dem Thema gefunden habe,
(mit komplexen Zahlen)
bekomme ich alleine nicht in "Ansi-C" gewandelt

ich suche mal weiter nach einem Beispiel in "C"

von fop (Gast)


Lesenswert?

Tja und jetzt hast Du ein Mathe-Problem ;-)

Da hilft jetzt echt nur unter Cordic und Pythagoras nachzuschlagen und 
nochmal zu büffeln.

von Rudolph R. (rudolph)


Lesenswert?

Oder das Problem EVE zu überlassen. :-)

von eric (Gast)


Lesenswert?

W.A. schrieb:
> Transformation auf Zylinderkoordinaten und prüfe dann den Winkel.

Polarkoordinaten reichen für 2 Dimensionen vollkommen :-)

In C bekommt man den Winkel dann z.B. einfach mit atan2(x,y) bzw atan2f, 
bläht dann eventuell je nach Plattform das ganze mit Softfloat Kram auf.

Und den Radius bekommt man mitm Pythagoras.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Uwe B. schrieb:
> ich suche mal weiter nach einem Beispiel in "C"

Uwe B. schrieb:
> leider war Mathe noch nie meine Stärke :-)
Dann mal Schritt für Schritt nach der Holzhammermethode...
Annahmen:
a) der Ursprung deines Bildschirms ist links oben bei 0,0
b) der "Drehregler" hat seinen Mittelpunkt bei kx,ky = 300,200
c) er hat einen Radius von 100
1. du bekommt einen Punkt z.B. tx,ty = 250,220 vom Touch
2. du ziehst den Mittelpunkt des Drehreglers ab:
   Normalisierung x,y = tx-kx,ty-ky = 300-250,200-220 = 50,-20
3. du berechnest den Abstand dieses Punktes mit dem Pythagoras:
   Abstand a = sqrt(x²+y²) = sqrt(50*50 + -20*-20) = 54
   --> Prüfung 1: 54 ist innerhalb des Radius 100 -- ok, weiter
4. du berechnest den Winkel z.B. mit der Sinusumkehrfunktion Arcussinus:
   w = asin(x/a) = asin(50/53) = 1,2327
Und jetzt musst du nur noch wissen,dass dieser Winkel im Bogenmaß 
0..360° = 0..2pi = 0..6,28 herauskommt. Und zudem musst du zu diesem 
Winkel noch den richtigen Quadranten des Drehreglers zuordnen, denn es 
gibt zwei Punkte mit x=50 und a=53 (rechts und links der Senkrechten).
Aber das wars dann schon. Schlau geschrieben passt das locker in 5 
Zeilen Code.

EDIT: das mit dem atan2() macht den Schritt 4 viel einfacher, weil es 
die Suche nach dem richtigen Quadranten spart. Fazit: 2 Zeilen Code 
reichen aus... ;-)

: Bearbeitet durch Moderator
von MaWin (Gast)


Lesenswert?

Uwe B. schrieb:
> ich suche ein Formel, die mir zurückgibt ob der Punkt x,y
> innerhalb vom Kreisabschnitt liegt oder nicht

https://de.wikipedia.org/wiki/Polarkoordinaten

if(sqrt((PunktX-MittelpunktX)^2+(PunktY-MittelpunktY)^2)<Radius)
{
    segment=atan2(PunktY-MittelpunktY,PunktX-MittelpunktX)/2.5464;
}

von W.A. (Gast)


Lesenswert?

eric schrieb:
> Polarkoordinaten reichen für 2 Dimensionen vollkommen :-)

Stimmt, so hießen die Dinger, wenn man sich auf den Spezialfall mit z=0 
beschränkt ;-)

von Uwe B. (derexponent)


Lesenswert?

ok, Danke an alle

werde versuchen es mit dem Zweizeiler umzusetzen

von pragmat (Gast)


Lesenswert?

Ich würde einen Schieberegler bauen. Der ist außerdem noch besser 
bedienbar...

von Uwe B. (derexponent)


Lesenswert?

MaWin schrieb:
> if(sqrt((PunktX-MittelpunktX)^2+(PunktY-MittelpunktY)^2)<Radius)
> {
>     segment=atan2(PunktY-MittelpunktY,PunktX-MittelpunktX)/2.5464;
> }

ich habe 12 Segmente und die atan2 Werte gehen von -pi bis +pi

also habe ich diese Formel benutzt :

if(sqrt((PunktX-MittelpunktX)^2+(PunktY-MittelpunktY)^2)<Radius)
{
    segment=atan2(PunktY-MittelpunktY,PunktX-MittelpunktX)+Pi/(2*Pi/12);
}

funktioniert, Danke nochmal

@pragmat,

ich brauche eine "unendliche" Bewegung
soll ein Oszi werden (mal wieder :-)

Gruss Uwe

von stromer (Gast)


Lesenswert?

Uwe B. schrieb:
> ich brauche eine "unendliche" Bewegung

Alles klar. Hätte ich mir eigentlich auch denken können, daß sich 
niemand umsonst das Leben unnötig schwer macht...:-)

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.