punkt innerhalb oder außerhalb vom Kreisabschnitt

OP #4495130
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
Angehängte Dateien:
Gast #4495207
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.
Moderator (Firma: Titel) Persönliche Seite #4495208
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... ;-)
OP #4495303
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren