2013-09-19 4 views
0

Предположим, что у меня есть значения X = 0, Y = 0, и я хочу вычислить новую точку (X1, Y1) из вектора и величины. Скажем, вектор на 90 градусов (а не в радианах), а величина 10, так что код будет выглядеть примерно так:Я понимаю, что Sin и Cos находятся в радианах, но почему я все еще на 90 градусов?

x1 = X + (10 * Math.Cos(90 * (Math.PI/180.0))); 
y1 = Y + (10 * Math.Sin(90 * (Math.PI/180.0))); 

И тогда я рисую линию, чтобы подтвердить результаты

DrawLine(X,Y,x1,y1); 

Но моя линия отключена на 90 градусов! Если я вычту 90 из угла, который я перехожу в Cos и Sin, все получается отлично. Итак, я думаю, я могу жить с этим.

Вот снимок экрана: enter image description here

Я передаю его 90 и я ожидаю линию идти на запад - восток. Я предполагаю, что 0 градусов приходится на север. Я знаю, что система координат, которую я использую, является горизонтальной, а Y - вертикальной.

Мне просто интересно, что мне не хватает.

+0

Ваш код выглядит хорошо для меня. В каком направлении ваш вектор указывает (используйте север/юг/восток/запад, чтобы мы могли это себе представить) и в каком направлении вы ожидали, что он укажет? –

+1

Возможно, вы сможете увидеть скриншот того, как он выглядит и что вы ожидаете от него. –

+6

Как вы измеряете углы? Триггерные функции ожидают, что theta = 0 соответствует оси + X (восток), причем theta увеличивается в направлении против часовой стрелки. Для заголовков компаса тета = 0 соответствует северу и увеличивается по часовой стрелке. –

ответ

0

Я не вижу проблем с x и y.

You use COS for x. COS(0) = 1 , COS(90) = 0 
You use SIN for y. SIN(0) = 0 , SIN(90) = 1 

И для экрана системы координат:

x+ is left to right 
y+ is top to bottom 

Вот почему линия проходит от верха до низа.

Как вы можете видеть, линия не является приятной и прямой. Следуйте декларации Math.PI, и вы увидите: public const double PI = 3.14159(я не знаю, кто ответственен за это, но я его увожу). Это не очень точно! Попробуйте заменить PI с: 3.14159265358979323846

Делает:

public const double BETTER_PI = 3,14159265358979323846 

x1 = X + (10 * Math.Cos(90 * (BETTER_PI/180.0))); 
y1 = Y + (10 * Math.Sin(90 * (BETTER_PI/180.0))); 

Итак:

x1 = X + (10 * Math.Cos(1.57079632679)) = X + (10 * 0) = X + 0; 
y1 = Y + (10 * Math.Sin(1.57079632679)) = Y + (10 * 1) = Y + 10; 
+1

'Math.PI' (как в [' System.Math.PI'] (http://msdn.microsoft.com/en-us/library/system.math.pi.aspx)) определяется как «3.14159265358979323846». Если вы смотрите на метаданные сборки, это [неверное представление значения] (http://stackoverflow.com/a/3742710/1269654). Вы должны быть в порядке, используя 'Math.PI' для почти любого использования. –

2

Неожиданное целое усечение

Преобразование из градусов в радианы привело к значению около pi/2, но не совсем. (Трудно сделать, поскольку pi трансцендентен.) Math.Cos(near_pi/2) привело к значению около 0,0, но не _ 0.0. Предположим, что он был отрицательным, как -6.1е-17.

Предполагая, что «X» было число с плавающей точкой с целочисленным значением, результатом X + small_negative_number был номер просто меньше, чем целое значение. Присвоение этому результату x1 и присвоение его функции plot(), которая, безусловно, использует целочисленные значения, вызвала целочисленное усечение вплоть до следующего нижнего целого.

Таким образом, ожидаемая прямая линия составляет 1 пиксель.

Общее решение - представить plot(x,y) с целыми значениями, которые получены из округлеными значениями с плавающей запятой.

x_int = round(X_floating_point);