Я пытаюсь сделать некоторые расширенные функции с картами Android и для этого мне нужно сделать некоторые операции с векторами. Теперь - я прочитал ответ от этого , и он дал мне некоторые советы и подсказки. Однако есть часть, которую я не понимаю. Пожалуйста, позвольте мне процитировать это:
Теперь, когда у нас есть луч с его начальной и конечной координатами, проблема переходит от «точки внутри многоугольника» к «как часто пересекает луч со стороны многоугольника». Поэтому мы не можем просто работать с точками многоугольника, как раньше (для ограничительной рамки), теперь нам нужны фактические стороны. Сторона всегда определяется двумя точками.
сторона 1: (X1 / Y1) - (X2 / Y2) сторона 2:
(X2 / Y2) - (X3 / Y3) сторона 3:
(Х3 / Y3) - (Х4 / Y4)
Итак, я понимаю, что каждая сторона треугольника на самом деле является вектором. Но как можно вычесть 2 балла? Допустим, у меня есть треугольник с 3 вершинами: A (1,1), B (2,2), C (1,3). Таким образом, в соответствии с этим, я должен сделать, например, (1,1) - (2,2), чтобы вычислить одну из сторон. Вопрос в том, как это сделать программно в Java / Android? Ниже я прилагаю код, который я уже разработал:
/** Creating the containers for screen
* coordinates taken from geoPoints
*/
Point point1_screen = new Point();
Point point2_screen = new Point();
Point point3_screen = new Point();
/* Project them from the map to screen */
mapView.getProjection().toPixels(point1, point1_screen);
mapView.getProjection().toPixels(point2, point2_screen);
mapView.getProjection().toPixels(point3, point3_screen);
int xA = point1_screen.x;
int yA = point1_screen.y;
int xB = point2_screen.x;
int yB = point2_screen.y;
int xC = point3_screen.x;
int yC = point3_screen.y;
int[] xPointsArray = new int[3];
int[] yPointsArray = new int[3];
xPointsArray[0] = xA;
xPointsArray[1] = xB;
xPointsArray[2] = xC;
yPointsArray[0] = yA;
yPointsArray[1] = yB;
yPointsArray[2] = yC;
Arrays.sort(xPointsArray);
int xMin = xPointsArray[0];
int yMin = yPointsArray[0];
int xMax = xPointsArray[xPointsArray.length-1];
int yMax = xPointsArray[xPointsArray.length-1];
int e = (xMax - xMin) / 100; // for ray calcultions
int width = mapView.getWidth();
int height = mapView.getHeight();
if(pPoint.x < xMin || pPoint.x > xMax || pPoint.y > yMin || pPoint.y < yMax)
{
DisplayInfoMessage(pPoint.x + " < " + xMin + " AND " + pPoint.x + " > " + xMax + " || " + pPoint.y + " < " + yMin + " AND " + pPoint.y + " > " + yMax );
// DisplayInfoMessage("Minimum is: "+ yPointsArray[0] + " and the maximum is: "+ yPointsArray[xPointsArray.length-1]);
}
else
{
GeoPoint start_point = new GeoPoint(xMin - e, pPoint.y);
Point start_point_container = new Point();
mapView.getProjection().toPixels(start_point, start_point_container);
int a, b, c, tx, ty;
int d1, d2, hd;
int ix, iy;
float r;
// calculating vector for 1st line
tx = xB - xA;
ty = yB - yA;
// equation for 1st line
a = ty;
b = tx;
c = xA*a - yA*b;
// get distances from line for line 2
d1 = a*xB + b*yB + c;
d2 = a*pPoint.x + b*pPoint.y + c;
DisplayInfoMessage("You clicked inside the triangle!" + "TRIANGLE POINTS: A("+xA+","+yA+") B("+xB+","+yB+") C("+xC+","+yC+")");
}
В pPoint содержатся координаты точки, по которой щелкнул пользователь. Я надеюсь, что я объяснил свою проблему достаточно хорошо. Может ли кто-нибудь помочь мне с этим? Оценил!