Calculate coordinates of a regular polygon's vertices

后端 未结 7 1865
醉酒成梦
醉酒成梦 2020-12-12 18:30

I am writing a program in which I need to draw polygons of an arbitrary number of sides, each one being translated by a given formula which changes dynamically. There is som

7条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-12 18:46

    One possible implementation to generate a set of coordinates for regular polygon is to:

    Define polygon center, radius and first vertex1.
    Rotate the vertex n-times2 at an angle of: 360/n.

    In this implementation I use a vector to store the generated coordinates and a recursive function to generate them:

    void generateRegularPolygon(vector& v, Point& center, int sidesNumber, int radius){
        // converted to radians
        double angRads = 2 * PI / double(sidesNumber);
        // first vertex  
        Point initial(center.x, center.y - radius);
        rotateCoordinate(v, center, initial, angRads, sidesNumber);
    }
    

    where:

    void rotateCoordinate(vector& v, Point& axisOfRotation, Point& initial, double angRads, int numberOfRotations){
        // base case: number of transformations < 0
        if(numberOfRotations <= 0) return;
        else{
            // apply rotation to: initial, around pivot point: axisOfRotation
            double x = cos(angRads) * (initial.x - axisOfRotation.x) - sin(angRads) * (initial.y - axisOfRotation.y) + axisOfRotation.x;
            double y = sin(angRads) * (initial.x - axisOfRotation.x) + cos(angRads) * (initial.y - axisOfRotation.y) + axisOfRotation.y;
            // store the result
            v.push_back(Point(x, y));
            rotateCoordinate(v, axisOfRotation, Point(x,y), angRads, --numberOfRotations);
        }
    }
    

    Note:

    Point is a simple class to wrap the coordinate into single data structure:

    class Point{
    public:
        Point(): x(0), y(0){ }
        Point(int xx, int yy): x(xx), y(yy) { }
    private:
        int x;
        int y; 
    }; 
    

    1 in terms of (relative to) the center, radius. In my case the first vertex is translated from the centre up horizontally by the radius lenght.

    2 n-regular polygon has n vertices.

提交回复
热议问题