Is a point inside regular hexagon

前端 未结 8 1623
心在旅途
心在旅途 2020-12-31 08:59

I\'m looking for advice on the best way to proceed. I\'m trying to find whether a given point A:(a, b) is inside a regular hexagon, defined with center O:(x, y) and diameter

相关标签:
8条回答
  • 2020-12-31 09:32

    You can use the equations for each of the sides of the hexagon; with them you can find out if a given point is in the same half-plane as the center of the hexagon.

    For example, the top-right side has the equation:

    -sqrt(3)x - y + sqrt(3)/2 = 0
    

    You plug in this the coordinates of the point and then the coordinates of the center. If the results have the same sign, then the point is in the bottom-left half-plane (so it may be inside the hexagon).

    You then repeat by using the equations of the others sides.
    Note that this algorithm will work for any convex polygon.

    0 讨论(0)
  • 2020-12-31 09:32

    What you want is the code to find out whether a point is inside a convex polygon, an hexagon being a particular case of that.

    Here's a good answer: https://stackoverflow.com/a/34689268/516188

    I did modify that function for my use, I find my version clearer. It's typescript (you just squint and it's javascript):

    function vectorX(v: Vector): number {
        return v[1].x - v[0].x;
    }
    
    function vectorY(v: Vector): number {
        return v[1].y - v[0].y;
    }
    
    function crossProduct(v1: Vector, v2: Vector): number {
        return vectorX(v1)*vectorY(v2) - vectorY(v1)*vectorX(v2);
    }
    
    function isInConvexPolygon(testPoint: Point, polygon: Polygon): boolean {
        // https://stackoverflow.com/a/34689268/516188
        if (polygon.length < 3) {
            throw "Only supporting polygons of length at least 3";
        }
        // going through all the edges around the polygon. compute the
        // vector cross-product http://allenchou.net/2013/07/cross-product-of-2d-vectors/
        // to find out for each edge on which side of the edge is the point.
        // if the point is on the same side for all the edges, it's inside
        let initCrossIsPositive = undefined;
        for (var i=0;i<polygon.length;i++) {
            if (polygon[i].x === testPoint.x &&
                polygon[i].y === testPoint.y) {
                // testPoint is an edge of the polygon
                return true;
            }
            const curPointOnEdge = polygon[i];
            const nextPointOnEdge = polygon[(i+1)%polygon.length];
            const vector1 = <[Point,Point]>[curPointOnEdge, nextPointOnEdge];
            const vector2 = <[Point,Point]>[curPointOnEdge, testPoint];
            const cross = crossProduct(vector1, vector2);
            if (initCrossIsPositive === undefined) {
                initCrossIsPositive = cross > 0;
            } else {
                if (initCrossIsPositive !== (cross > 0)) {
                    return false;
                }
            }
        }
        // all the cross-products have the same sign: we're inside
        return true;
    }
    
    0 讨论(0)
提交回复
热议问题