Is a point inside regular hexagon

前端 未结 8 1693
心在旅途
心在旅途 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

    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[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;
    }
    

提交回复
热议问题