Как определить по двум координатам , к каким террейнам относиться прямоугольная (квадратная область)?
Есть две координаты UnityEngine.Vector2 TopLeft, LowerRight; мне надо заранее определить к каким террейнам относиться область, которую буду красить:

Сейчас каждый раз пробегаю по всем террейнам:
...
foreach (var terrain in terrains)
{
if (drawcoord[0].x >= terrain.GetPosition().x && drawcoord[0].x <= terrain.GetPosition().x + terrain.terrainData.size.x &&
drawcoord[0].z >= terrain.GetPosition().z && drawcoord[0].z <= terrain.GetPosition().z + terrain.terrainData.size.z)
{
...
}
}
...
Ответы (2 шт):
Сам метод:
public class LofP
{
static public List<Terrain> getListTerrains(UnityEngine.Vector2 topLeft, UnityEngine.Vector2 lowerRight, List<Terrain> terrains)
{
List<Terrain> tempLT = new List<Terrain>();
List<Vector3> drawcoord = new List<Vector3>();
drawcoord.Add(new Vector3(topLeft.x, 0, topLeft.y));
drawcoord.Add(new Vector3(lowerRight.x, 0, topLeft.y));
drawcoord.Add(new Vector3(lowerRight.x, 0, lowerRight.y));
drawcoord.Add(new Vector3(topLeft.x, 0, lowerRight.y));
UnityEditor.Experimental.TerrainAPI.Processing.drawcoordList list = UnityEditor.Experimental.TerrainAPI.Processing.positionNext(drawcoord, 10);
foreach (var pos in list.drawcoordCenter)
{
foreach (var terrain in terrains)
{
if (pos.x >= terrain.GetPosition().x && pos.x <= terrain.GetPosition().x + terrain.terrainData.size.x &&
pos.z >= terrain.GetPosition().z && pos.z <= terrain.GetPosition().z + terrain.terrainData.size.z) //если точка находится на текущем террейне
{
tempLT.Add(terrain);
}
}
}
return tempLT;
}
}
Процесс формирования промежуточных точек:
namespace UnityEditor.Experimental.TerrainAPI
{
public class Processing
{
static public drawcoordList positionNext(List<Vector3> drawcoord, int N)
{
drawcoordList list = new drawcoordList();
for (int i = 0; i < drawcoord.Count - 1; i++)
{
float deltax = (drawcoord[i + 1].x - drawcoord[i].x) / N;
float deltaz = (drawcoord[i + 1].z - drawcoord[i].z) / N;
// float deltax = 0;
// float deltaz = 0;
float xci = drawcoord[i].x;
float xri = xci + deltaz;
float xli = xci - deltaz;
float zci = drawcoord[i].z;
float zri = zci - deltax;
float zli = zci + deltax;
list.drawcoordLeft.Add(new Vector3(xli, 0, zli));
list.drawcoordCenter.Add(new Vector3(xci, 0, zci));
list.drawcoordRight.Add(new Vector3(xri, 0, zri));
}
if (list.drawcoordCenter.Count == 0) { list = null; }
return list;
}
public class drawcoordList
{
public List<Vector3> drawcoordLeft;
public List<Vector3> drawcoordCenter;
public List<Vector3> drawcoordRight;
public drawcoordList()
{
drawcoordLeft = new List<Vector3>();
drawcoordCenter = new List<Vector3>();
drawcoordRight = new List<Vector3>();
}
}
}
}
Использование:
List<Terrain> terrains;
...
terrains = LofP.getListTerrains(new Vector2(metric.minpointx, metric.minpointz), new Vector2(metric.maxpointx, metric.maxpointz),terrains);
Попробую сформулировать так:
Имеется заполнение плоскости одинаковыми прямоугольниками шириной каждого W и высотой H, уложенными в R рядов и C колонок. Нужно найти, какому прямоугольнику соответствует точка с координатами px, py
Номер ряда и колонки с использованием целочисленного деления:
NR = py / H
NC = px / W
Если прямоугольники упакованы в двумерный массив, то это готовые индексы. Если же одномерный, то номер прямоугольника в нём
idx = NR * C + NC
