2013-09-16 5 views
-1

Я знаю, что теория поворота точки на угол в миллионе раз в Интернете, но я не получу свой код для правильной работы.Вращающаяся точка по углу

У меня есть линия с 2 очками, когда вы нажимаете на 1 из 2 точек, вы поворачиваете точку относительно другой точки. В моей тестовой папке у меня верхняя левая точка и нижняя правая точка, поэтому диагональная линия.

Я хочу убедиться, что линия привязана к повороту на 90 градусов, поэтому она всегда будет прямой (по вертикали или по горизонтали). Поэтому я сначала получаю текущий угол, затем получаю угол, который должен быть, и вычисляю разницу.

Point startPoint = obj2.Location; 
Point currentEndPoint = new Point(obj2.Location.X + obj2.Size.Width, obj2.Location.Y + obj2.Size.Height); 
Point newEndPoint = e.Location; 
double angle = MathHelper.GetAngleOfVerticalLine(startPoint, newEndPoint); 
double angleToBe = MathHelper.GetClosestNumber(angle, new double[] { 0, 90, 180, 270, 360 }); 
double angleToDo = 0.0; // -5 
if (angle < angleToBe) 
{ 
    angleToDo = Math.Abs(angle - angleToBe); 
} 
else 
{ 
    angleToDo = angleToBe - angle; 
} 
angleToDo %= 360; 
Point newSize = MathHelper.RotatePoint(newEndPoint, startPoint, angleToDo); 

obj.Size = (Size)newSize; 

public static Point RotatePoint(Point pointToRotate, Point centerPoint, double angleInDegrees) 
{ 
    double angleInRadians = angleInDegrees * (Math.PI/180); 
    double cosTheta = Math.Cos(angleInRadians); 
    double sinTheta = Math.Sin(angleInRadians); 
    return new Point 
    { 
     X = 
      (int) 
      (cosTheta * (pointToRotate.X - centerPoint.X) - 
      sinTheta * (pointToRotate.Y - centerPoint.Y) + centerPoint.X), 
     Y = 
      (int) 
      (sinTheta * (pointToRotate.X - centerPoint.X) + 
      cosTheta * (pointToRotate.Y - centerPoint.Y) + centerPoint.Y) 
    }; 
} 

Но результаты, которые я получаю, не являются прямыми, но они являются случайными. Угол, angleToBe и angleToDo работают правильно. Тогда метод RotatePoint должен быть проблемой, но я не уверен в этом на 100%.

+0

Что не работает должным образом? Получение угла, или получение точки, или что? – davidsbro

+2

Итак, каков ваш вопрос? –

+0

Я забыл последний абзац, извините. Как я уже сказал, я получаю случайные строки, и проблема наиболее вероятна в методе RotatePoint или в сочетании с моим общим кодом/использованием. – ErwinOkken

ответ

0

Разве вы не можете использовать класс Matrix.Rotate для тяжелого подъема? Источник: http://msdn.microsoft.com/en-us/library/s0s56wcf.aspx (Разумеется, математика - половина удовольствия).

+0

Это именно то, что я делаю сейчас (потому что математика не подходит для меня хорошо). Переведя его в начало, затем повернуть, а затем перевести назад, выполняет ли задание. – ErwinOkken

Смежные вопросы