punkt innerhalb oder außerhalb vom Kreisabschnitt

OP #4495130
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:
OP
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"
Gast
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
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
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.