Jump to content
Unity Insider Forum

Interpolation zwischen Zellen


Nyral

Recommended Posts

Hallo,

ich habe ein 2D Grid(2D Array) das aus 100x100 Zellen besteht. Die Ausgangsfarbe der Zellen ist dabei Blau. Jetzt kann ich die Zellen von Blau auf Gelb färben, wenn ich auf die gewünschte Zelle klicke. Das Funktioniert schon. Mein Problem ist das dass registrieren des Mausklicks und das anschließende umfärben der Zelle im Update passiert. Wenn ich jetzt schnell mit gedrückter Maustaste über das Feld fahre, werden nur die Zellen umgefärbt, wo sich der Mauszeiger zur Zeit des Update befunden hat.

Wie Realisiere ich jetzt am besten das die Zellen zwischen den verschiedenen Mauspositionen umgefärbt werden bzw. wie Interpoliere ich am besten zwischen den Zellen?

Mein Code Snippet zum umfärben einer Zelle beim Klick mit der Linken Maustaste (das Script hängt bei meinem GameManager GameObjekt):

void Update()
{
	if (Input.GetMouseButton((int)MOUSEBUTTONS.LEFT))
	{
 		Vector2 TempRayPos = new Vector2(Camera.main.ScreenToWorldPoint(Input.mousePosition).x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y);
    		RaycastHit2D TempHit = Physics2D.Raycast(TempRayPos, Vector2.zero, 0f);
              
   		if (TempHit.collider != null)
    	{
    		Cell TempCell = TempHit.transform.GetComponent<Cell>();
        	if (TempCell)
        	{
        		//Hier geschied dann das umfärben der Zelle           
        	}
     	}
	}
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

wenn du die Koordinaten der Zelle vom letzten und diesem Frame hast, kannst du dir eine Gerade durch diese zwei Punkte denken.

Dann kannst du von jeder Zelle den Abstand zu dieser Geraden berechnen, und wenn der z.B. kleiner 1 ist, färbst du die Zelle.

 

Im Grunde ist das das gleiche, wie wenn du versuchst eine Linie auf ein 100x100 Pixel Bild zu zeichnen. Bei Google findet man dazu mehrere Wege.

Das was ich oben beschrieben habe würde etwa so aussehen:

 

private bool[,] Cells = new bool[100, 100];


private void Line(int x1, int y1, int x2, int y2){
 Vector2 start = new Vector2(x1, y1);
 Vector2 dir = new Vector2(x2-x1, y2-y1); 
 float sqrLengthInv = 1f / Vector2.Dot(dir, dir);
  
 for(int y=0;y<100;y++){
  for(int x=0;x<100;x++){
   float k = Vector2.Dot(new Vector2(x-x1, y-y1), dir) * sqrLengthInv;  //projektion auf die Gerade
   Vector2 closestOnLine = start + dir * k;
   bool onLine = k>=0 && k<=1 && (closestOnLine-start).magnitude < 1;
   Cells[x][y] = onLine;
  }                   
 }
}

(nicht getestet)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...