Punkt innerhalb eines Kreises



  • Hi,
    eigentlich isses nur ein mathematisches Problem das ich hab. Trotzdem hoffe ich dsa ich hier richtig bin.
    Ich will eine Art "Scheinwerfer" über ein Bild legen, dazu hab ich ein transparentes Benutzersteuerelement das sich die Farbe des Hintergrundpixels holt, dieses mit einem Brigthnesswert multipliziert und wieder zeichnet.
    Mein Problem ist jetzt der Kreis.

    Damit ich auf alle Punkte(Pixel) meines Kreises komme, hab ich mal in einem Demoprojekt ansatzmässig so angesetzt:

    private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    		{
    			Point mittelpunkt = new Point(this.ClientRectangle.Width/2, this.ClientRectangle.Height/2);
    			int radius = this.ClientRectangle.Width/2;
    
    			Point Mykreis = new Point();
    
    			for (double alpha=0; alpha < 360; alpha++)
    			{
    				// Berechnung der Kreisbahn
    				Mykreis.X = (int)(radius * Math.Cos(alpha) + mittelpunkt.X);
    				Mykreis.Y = (int)(radius * Math.Sin(alpha) + mittelpunkt.Y);
    
    				// Alle Pixel der Form durchlaufen
    				for(int i=0; i < this.ClientRectangle.Width; i++)
    				{
    					for(int j=0; j < this.ClientRectangle.Height; j++)
    					{								
    						//Prüfung ob Punkt innerhalb des Kreises liegt 
    						if(i <= Mykreis.X)
    						{
    							if (j <= Mykreis.Y)
    							{
    								// Punkt zeichnen
    								e.Graphics.DrawEllipse(Pens.Black, i, j, 1,1);
    							}
    
    						}
    					}
    
    				}
    			}
    

    Leider geht das hier net wirklich.
    Da ich da schon ziemlich lange dransitzt und jetzt nen Ausssetzer hab, dachte ich vlt. hat hier einer sowas schonmal gemacht und kann mir bisschen helfen.
    Der Code müsste dann noch stark Optimiert werden das ist sowieso klar.
    So wie ich da Durchlauf dauert das nen halben Tag bis er durch ist.
    Aber ich denke er zeigt gut auf was ich vorhabe.

    mfg
    ToMjAcK



  • Nur ein Gedanke: Versuch' doch mal, alpha in Bogenmaß umzurechnen, bevor du es an die Winkelfunktionen weiterreichst.

    Und das zweite ist, daß du 360 mal alle Punkte abfragst, ob sie unterhalb eines Punktes aus dem Kreis liegen - verwende dort lieber den Pythagoras zur Entscheidung, ob der Punkt im Kreis liegt:

    Point m=...;//Mittelpunkt
    int r=...;//Radius
    for(int i=0; i < this.ClientRectangle.Width; i++)
    {
      for(int j=0; j < this.ClientRectangle.Height; j++)
      {                                
        if( ((i-m.X)*(i-m.X)+(j-m.Y)*(j-m.Y))<=r*r )
        {
          //Punkt zeichnen
        }
      }
    }
    


  • Tatsache das geht 🙂
    Viele DANK CStoll !


Anmelden zum Antworten