Мне нужно нарисовать дугу между двумя точками на краю круга. Предполагая, что дуга всегда рисуется на кратчайшем возможном расстоянии (edit2: флаг развертки установлен на 0), мне нужно знать, рисуется ли дуга по часовой стрелке или против часовой стрелки.
Я получил следующие входные данные:
Edit1: этот вопрос связан с дугами в svg. Следовательно, это относится к программированию.
Я голосую за то, чтобы закрыть этот вопрос, потому что он не о программировании, а чисто о математике/геометрии (при этом: проведите линию через центр и точку 1 и посмотрите, на какой стороне линии находится точка 2)
SVG не определяет CW/CCW эллиптической дуги, вместо этого он определяется как комбинация флагов larc/sweep вместе с конечными точками вашей эллиптической дуги, поэтому ответ: дуги могут быть как CW, так и CCW, в зависимости от случая, для получения дополнительной информации см.: Преобразование дуги svg в линии .. поэтому, как только вы получите реальный центр дуги, вы можете использовать перекрестное произведение для определения направления по часовой и против часовой стрелки вашей дуги.
@FranzGleichmann речь идет о формате файла svg ...
@MakePeaceGreatAgain специфичен для представления эллиптических дуг в формате файла SVG ... ни код, ни библиотека для этого не важны ...
но этот сайт посвящен проблемам программирование, а не форматам файлов
Найдите знак векторного произведения векторов point1-center и point2-center, чтобы выявить ориентацию кратчайшей дуги
@MakePeaceGreatAgain возникает вопрос при рисовании дуг в svg. Следовательно, это вопрос программирования.





Ответ заключается в том, что SVG поддерживает дуги как по часовой, так и против часовой стрелки. Вы переключаетесь между ними, изменяя флаг «развертки» в команде дуги (A).
Если вы хотите узнать, как работают дуги SVG, обратите внимание на файл Раздел дуг дуг спецификации SVG.
флаг развертки всегда равен 0 в моей проблеме
Играйте с дугами в: yqnn.github.io/svg-путь-редактор
Описав данные, можно определить, какая дуга меньше - против часовой стрелки или по часовой стрелке.
Просто проверьте знак векторного произведения векторов point1-center и point2-center, чтобы определить ориентацию кратчайшей дуги:
cp = (p1.x-c.x)*(p2.y-c.y)-(p1.y-c.y)*(p2.x-c.x)
Для cp>0 вы должны установить параметр sweep на 0, в противном случае на 1 (возможно, наоборот), в то время как large-arc-flag всегда должен быть 0.
не уверен, как это скажет, если дуга по часовой стрелке или против часовой стрелки, вот в чем вопрос. Флаг развертки всегда равен 0
Ваш вопрос касался возможно кратчайшее расстояние. Этот подход показывает, какое направление дает более короткую дугу.
Пожалуйста, внимательно прочитайте заголовок и вопрос. Спасибо :)
Вопрос говорит, что вы должны нарисовать дугу. Это правда?
После обсуждения с математиком я нашел ответ на этот вопрос и на его основе написал следующий код:
public static bool IsClockWise(Point point1, Point point2, Circle circle)
{
var dxPoint1 = point1.X - circle.CenterX;
var dyPoint1 = point1.Y - circle.CenterY;
var dxPoint2 = point2.X - circle.CenterX;
var dyPoint2 = point2.Y - circle.CenterY;
double thetaPoint1 = 0, thetaPoint2 = 0;
if (dxPoint1 > 0 && dyPoint1 >= 0)
thetaPoint1 = Math.Asin(dyPoint1 / circle.Radius);
else if (dxPoint1 <= 0 && dyPoint1 > 0)
thetaPoint1 = Math.PI - Math.Asin(dyPoint1 / circle.Radius);
else if (dxPoint1 < 0 && dyPoint1 <= 0)
thetaPoint1 = Math.Abs(Math.Asin(dyPoint1 / circle.Radius)) + Math.PI;
else if (dxPoint1 >= 0 && dyPoint1 < 0)
thetaPoint1 = 2 * Math.PI - Math.Abs(Math.Asin(dyPoint1 / circle.Radius));
if (dxPoint2 > 0 && dyPoint2 >= 0)
thetaPoint2 = Math.Asin(dyPoint2 / circle.Radius);
else if (dxPoint2 <= 0 && dyPoint2 > 0)
thetaPoint2 = Math.PI - Math.Asin(dyPoint2 / circle.Radius);
else if (dxPoint2 < 0 && dyPoint2 <= 0)
thetaPoint2 = Math.Abs(Math.Asin(dyPoint2 / circle.Radius)) + Math.PI;
else if (dxPoint2 >= 0 && dyPoint2 < 0)
thetaPoint2 = 2 * Math.PI - Math.Abs(Math.Asin(dyPoint2 / circle.Radius));
if (thetaPoint1 > thetaPoint2)
{
return !(thetaPoint1 - thetaPoint2 <= Math.PI);
}
return thetaPoint2 - thetaPoint1 <= Math.PI;
}
OMG ... Вы пробовали простое выражение из моего ответа?
как это вообще связано с программированием? О какой геометрической библиотеке вы говорите? Где твой код?