внутренние углы неправильного многоугольника с углами> 180


Я пытаюсь вычислить значения, показанные на картинке красным цветом, то есть внутренние углы.

У меня есть массив точек, где пересекаются линии, и я попробовал использовать точечное произведение, но оно возвращает только наименьшие углы. Мне нужен полный диапазон внутренних углов (0-359), но я не могу найти много, что соответствует этому критерию.

стрела

2   2   2015-03-03 02:24:48

2 ответа:

Предполагая, что ваши углы находятся в стандартном формате против часовой стрелки, должно работать следующее:

void angles(double points[][2], double angles[], int npoints){
    for(int i = 0; i < npoints; i++){
        int last = (i - 1 + npoints) % npoints;
        int next = (i + 1) % npoints;
        double x1 = points[i][0] - points[last][0];
        double y1 = points[i][1] - points[last][1];
        double x2 = points[next][0] - points[i][0];
        double y2 = points[next][1] - points[i][1];
        double theta1 = atan2(y1, x1)*180/3.1415926358979323;
        double theta2 = atan2(y2, x2)*180/3.1415926358979323;
        angles[i] = (180 + theta1 - theta2 + 360);
        while(angles[i]>360)angles[i]-=360;
    }
}
Очевидно, что если вы используете какую-то структуру данных для своих точек, вы захотите заменить double points[][2] и ссылки на нее ссылками на вашу структуру данных.

Вы можете получить полный диапазон углов (-Pi..Pi) с помощью функции atan2:

atan2(crossproduct, dotproduct)