Paralellogramme



  • Hi,

    ich will ne Mausabfrage coden, doch ich hab ein kleines Problem, die Buttons sind Paralellogramme. Nun... wie kann man Testen ob ein Punkt in diesem Paralellogramm drin ist?



  • Geraden durch die Kanten der Vierecke legen, jede Gerade hat eine innere und eine äussere Seite. Ist der Klick für alle vier Geraden auf der inneren Seite, so hast du rein geklickt!

    Bye, TGGC



  • Speicherverschwendung aber dafür einfach:

    Ein zweidimensionales Byte-Array für deinen Bildschirm erzeugen. Für jedes Pixel ein Byte. So das dein Array im Speicher genauso "aussieht" wie dein Bildschirm. Die Stellen an denen Knöpfe sind, werden im Array mit Werten gefüllt, die anderen bleiben auf 0.
    Damit du auch weisst, welcher Knopf gedrückt wurde, füllst du das ganze an den entsprechenden Stellen mit verschiedenen Werten. (Bei einem Byte pro Pixel kannst du so 256 Buttons unterbringen). Bei einem Mausklick auf den Bildschirm holst du dir den Wert im Array der zum betreffenden Pixel gehört und weisst sofort, welcher Button es ist.
    Ok ist "dreckige" Programmierung - Aber simpel 😉


  • Mod

    vom klickpunkt aus eine (gerade)strecke bis zum bildschirmrand definieren. schnittpunkte mit den rändern errechnen. hast du eine gerade anzahl von schnittpunkten ist der klick außerhalb gewesen ansonsten drinne.

    sollte bei jedem polygon klappen!

    rapso->greets();



  • rapso schrieb:

    vom klickpunkt aus eine (gerade)strecke bis zum bildschirmrand definieren. schnittpunkte mit den rändern errechnen. hast du eine gerade anzahl von schnittpunkten ist der klick außerhalb gewesen ansonsten drinne.

    sollte bei jedem polygon klappen!

    rapso->greets();

    Muß man nur aufpassen, daß man keinen Eckpunkt des Polygons erwischt...


  • Mod

    Sgt. Nukem schrieb:

    rapso schrieb:

    vom klickpunkt aus eine (gerade)strecke bis zum bildschirmrand definieren. schnittpunkte mit den rändern errechnen. hast du eine gerade anzahl von schnittpunkten ist der klick außerhalb gewesen ansonsten drinne.

    sollte bei jedem polygon klappen!

    rapso->greets();

    Muß man nur aufpassen, daß man keinen Eckpunkt des Polygons erwischt...

    dann man jede linie testet und nicht nicht das polygon als ganze, müßte man beim eckpunkt trotdem zwei schnittpunkte feststellen. wobei es natürlich fehler wegen float-ungenauigkeit gibt... oder überseh ich da eine fehlerquelle?

    rapso->greets();



  • rapso schrieb:

    Sgt. Nukem schrieb:

    rapso schrieb:

    vom klickpunkt aus eine (gerade)strecke bis zum bildschirmrand definieren. schnittpunkte mit den rändern errechnen. hast du eine gerade anzahl von schnittpunkten ist der klick außerhalb gewesen ansonsten drinne.

    sollte bei jedem polygon klappen!

    rapso->greets();

    Muß man nur aufpassen, daß man keinen Eckpunkt des Polygons erwischt...

    dann man jede linie testet und nicht nicht das polygon als ganze, müßte man beim eckpunkt trotdem zwei schnittpunkte feststellen. wobei es natürlich fehler wegen float-ungenauigkeit gibt... oder überseh ich da eine fehlerquelle?

    rapso->greets();

    Okay. 👍



  • Für meine Methode benötigt man nur den Abstand zu maximal 4 Geraden, Formel hatte wir ja letztens. Ist doch viel einfacher, als Methode. Da muss man ja erstmal 3mal um die Ecke denken, um auf sowas zu kommen!


  • Mod

    man kann auch die winkelsumme oder den flächeninhalt errechnen, das ist noch simpler. 🙄

    rapso->greets();



  • @TGGC:
    Hi,

    klingt interessant! wie kann man sowas den bewerkstelligen?



  • Oh man, wieder ein bescheuerter Thread...



  • hatte das problem auch mal (bei einem beliebigen Polygon). Habe das so gemacht

    bool pointInPoly(int pX, int pY, int *verticeData, int n)
    {
    	int cN=0;
    
    	if(n<=2)
    		return false;
    
    	for(int i=0;i<n;++i) {
    		int p1X=verticeData[2*i];
    		int p1Y=verticeData[2*i+1];
    
    		int p2X=(i<(n-1))?verticeData[2*(i+1)]:verticeData[0];
    		int p2Y=(i<(n-1))?verticeData[2*(i+1)+1]:verticeData[1];
    
    		if(((p1Y<=pY) && (p2Y>pY)) || ((p1Y>pY) && (p2Y<=pY))) {
    			float vT=float((pY-p1Y)/(p2Y-p1Y));
    			if(pX<p1X+vT*(p2X-p1X))
    				++cN;
    		}
    	}
    
    	return (cN&1);
    }
    

    pX, pY : zu testender Punkt.
    verticeData : Zeiger auf ein Array, in dem abwechselnd für alle Punkte die X und Y Koordinaten sind. zB:
    // polygon mit 3 eckpunkten
    int verticeData[6]={Xp1, Yp1, Xp2, Yp2, Xp3, Yp3};
    n : anzahl der zu verwendenen Punkte.

    man kann die Funktion natürlich noch beliebig umändern.


Log in to reply