/// <summary> /// если одна точка сетки поменяла позицию - перестраиваем /// </summary> private void CheckChainUpdate() { if (buttonRectLU_last != buttonRectLU.Rectangle) //если хотя бы одна точка сетки (LU,RU,LD,RD) сдвинулась - перестраиваю сетку { seineParams = BuildChain(seineParams); seineParamsForButton = BuildChain(seineParamsForButton); buttonRectLU_last = buttonRectLU.Rectangle; } if (buttonRectRU_last != buttonRectRU.Rectangle) //если хотя бы одна точка сетки (LU,RU,LD,RD) сдвинулась - перестраиваю сетку { seineParams = BuildChain(seineParams); seineParamsForButton = BuildChain(seineParamsForButton); buttonRectRU_last = buttonRectRU.Rectangle; } if (buttonRectLD_last != buttonRectLD.Rectangle) //если хотя бы одна точка сетки (LU,RU,LD,RD) сдвинулась - перестраиваю сетку { seineParams = BuildChain(seineParams); seineParamsForButton = BuildChain(seineParamsForButton); buttonRectLD_last = buttonRectLD.Rectangle; } if (buttonRectRD_last != buttonRectRD.Rectangle) //если хотя бы одна точка сетки (LU,RU,LD,RD) сдвинулась - перестраиваю сетку { seineParams = BuildChain(seineParams); seineParamsForButton = BuildChain(seineParamsForButton); buttonRectRD_last = buttonRectRD.Rectangle; } }
/// <summary> /// строится сетка /// </summary> /// <param name="seineParams"></param> /// <returns>возвращается построенная сетка (массивы прямых)</returns> private SeineParams BuildChain(SeineParams seineParams) //строится сетка { seineParams.seine = new Vector2[4, seineParams.resolution + 1]; //здесь заполняю массив из точек, которые были получены делением прямых //хранение всех точек при пересечениях прямых? //по точкам строю прямые LU-LD, LU-RU, RU-RD, RD-LD, затем бью их на 3 по длине, и ищу точки разбиения //прямые строится не через GUIHelper? for (int i = 0; i < seineParams.resolution + 1; i++) { seineParams.seine[0, i] = new Vector2( buttonRectLU.World.x + (buttonRectRU.World.x - buttonRectLU.World.x) / (1.0f * seineParams.resolution) * i, buttonRectLU.World.y + (buttonRectRU.World.y - buttonRectLU.World.y) / (1.0f * seineParams.resolution) * i); seineParams.seine[1, i] = new Vector2( buttonRectRU.World.x + (buttonRectRD.World.x - buttonRectRU.World.x) / (1.0f * seineParams.resolution) * i, buttonRectRU.World.y + (buttonRectRD.World.y - buttonRectRU.World.y) / (1.0f * seineParams.resolution) * i); seineParams.seine[2, i] = new Vector2( buttonRectLD.World.x + (buttonRectRD.World.x - buttonRectLD.World.x) / (1.0f * seineParams.resolution) * i, buttonRectLD.World.y + (buttonRectRD.World.y - buttonRectLD.World.y) / (1.0f * seineParams.resolution) * i); seineParams.seine[3, i] = new Vector2( buttonRectLU.World.x + (buttonRectLD.World.x - buttonRectLU.World.x) / (1.0f * seineParams.resolution) * i, buttonRectLU.World.y + (buttonRectLD.World.y - buttonRectLU.World.y) / (1.0f * seineParams.resolution) * i); } //здесь заполняются коэффициенты прямых k и b - ищу по пересечениям прямых, полученных выше seineParams.koef = new Vector2[2, seineParams.resolution + 1]; float k, b; for (int i = 0; i < seineParams.resolution + 1; i++) { k = (seineParams.seine[2, i].y - seineParams.seine[0, i].y) / (seineParams.seine[2, i].x - seineParams.seine[0, i].x); b = seineParams.seine[0, i].y - k * seineParams.seine[0, i].x; seineParams.koef[0, i] = new Vector2(k, b); } for (int i = 0; i < seineParams.resolution + 1; i++) { k = (seineParams.seine[3, i].y - seineParams.seine[1, i].y) / (seineParams.seine[3, i].x - seineParams.seine[1, i].x); b = seineParams.seine[1, i].y - k * seineParams.seine[1, i].x; seineParams.koef[1, i] = new Vector2(k, b); } return(seineParams); }