Как определить вектор, используя 2 точки на карте Android? - PullRequest
1 голос
/ 19 августа 2010

Я пытаюсь сделать некоторые расширенные функции с картами 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 содержатся координаты точки, по которой щелкнул пользователь. Я надеюсь, что я объяснил свою проблему достаточно хорошо. Может ли кто-нибудь помочь мне с этим? Оценил!

1 Ответ

1 голос
/ 20 августа 2010

Я не разработчик Android, но я вижу, что android.graphics.drawable.shapes.Shape не хватает contains() метода, найденного в java.awt.Shape. Похоже, вам придется разработать собственный тест, как предложено в статье , которую вы цитировали. Кроме того, вы можете захотеть взглянуть на алгоритмы пересечения / обмотки .

Но как можно вычесть 2 балла?

Вычитание векторов хорошо определено и легко реализовано в Java. Учитывая две точки как векторы, компоненты разности представляют тангенс (наклон) прямой, соединяющей точки. Пример в статье реализует это в следующих строках:

//get tangent vector for line 1
tx = v1x2 - v1x1;
ty = v1y2 - v1y1;

Основа показанного подхода обсуждается далее в Пересечения линий и сегментов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...