У меня есть угол, длина линии и заданная начальная точка, и я хочу вычислить целевую точку, чтобы переместить мой объект сюда. Я слежу за этим постом и некоторыми другими:
cocos2d вычисляет точку назначения, учитывая начальную точку, угол и расстояние
Проблема: для 1-го и 4-го квадранта это дает мне правильный угол. Но для 2-го и 3-го квадранта все идет в противоположном направлении. Я не мог понять проблему. Это изображение может прояснить:
Зеленые стрелки показывают мое предполагаемое направление, а красные стрелки показывают, куда оно на самом деле идет.
Мой код до сих пор:
float m = (targetPosition.y - initialPosition.y) / (targetPosition.x - initialPosition.x);
angle = atan (m) * 180 / PI;
int lineLength = 200;
float radiansAngle = CC_DEGREES_TO_RADIANS(angle);
Vec2 endPoint;
endPoint.y = sinf(radiansAngle) * lineLength + initialPosition.y;
endPoint.x = cosf(radiansAngle) * lineLength + initialPosition.x;
Обратите внимание, что в каждом случае сбоя красный и зеленый векторы имеют одинаковые m
, так код не может угадать, какой вы имеете в виду.
Вы можете написать еще немного кода для обнаружения квадранта и соответственно добавить или вычесть π. Или просто использовать atan2
.
Я думаю, что ваша проблема связана с периодичностью функции загара. Вам нужно будет рассчитать, в каком квадранте вы находитесь.
Некоторое время назад я произвел нечто подобное, но немного другое для openscad. Возможно, вы сможете адаптировать его к вашим потребностям. Я выделил соответствующую строку. Я использую asin, но применяются аналогичные принципы.
module ql (x1,y1,x2,y2,w,thickness=2){
length=sqrt(pow((x1-x2),2)+pow((y1-y2),2));
//Next line corrects the angle for quadrant
ang=((x2-x1)<0)?180-asin((y2-y1)/length):asin((y2-y1)/length);
translate([x1,y1,0]){
rotate([0,0,ang]){
translate([0,-w/2,0]){
scale([length,w,thickness]){
cube(1);
}
}
}
}
}