Как определить по двум координатам , к каким террейнам относиться прямоугольная (квадратная область)?

Есть две координаты 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 шт):

Автор решения: Ivan Triumphov

Сам метод:

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);

введите сюда описание изображения

→ Ссылка
Автор решения: MBo

Попробую сформулировать так:

Имеется заполнение плоскости одинаковыми прямоугольниками шириной каждого W и высотой H, уложенными в R рядов и C колонок. Нужно найти, какому прямоугольнику соответствует точка с координатами px, py

Номер ряда и колонки с использованием целочисленного деления:

NR = py / H
NC = px / W 

Если прямоугольники упакованы в двумерный массив, то это готовые индексы. Если же одномерный, то номер прямоугольника в нём

idx = NR * C + NC
→ Ссылка