2016-03-02 3 views
1

У меня есть программа C#, где мне нужно нарисовать некоторые простые 2D-объекты на холсте.Линии и фигуры, нарисованные под неправильными углами

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

private void CalculateEndPoint() 
{ 
      double angle = Helper.deg2rad((double)this.StartAngle); 
      int x = this.StartPoint.X + (int)(Math.Cos(angle) * this.Length * -1); 

      int y = this.StartPoint.Y + (int)(Math.Sin(angle) * this.Length); 
      this.EndPoint = new Point(x, y); 
} 

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

Circle degrees

Где, как я ожидал 0 в верхней части, 90 справа, 180 на дно и т.д.

Таким образом, чтобы получить форму, чтобы рисовать прямо на холсте, я должен указать 90 градусов, где, как я мог бы ожидать, указать 180.

Я сделал что-то не так? Или это просто недостаток понимания?

ответ

1

Вы должны изменить свою CalculateEndPoint функцию, чтобы иметь, что:

private static void CalculateEndPoint(double dec) 
{ 
    double angle = (Math.PI/180) * (this.StartAngle + 90); // add PI/2 
    int x = StartPoint.X + (int)(Math.Cos(angle) * Length * -1); 

    double angle2 = (Math.PI/180) * (this.StartAngle - 90); // minus PI/2 
    int y = StartPoint.Y + (int)(Math.Sin(angle2) * Length); 
    EndPoint = new Point(x, y); 
} 
+0

Хороший код, спасибо. Но переменная «dec» не нужна! –

+1

Да, я использовал его для тестирования. – Sakura

1

На самом деле, 0 должно быть справа. Вы умножаете x-координату на -1, поэтому вы перемещаете ее влево.
Просто запомните эти 2 правила:
- Косинус угла - это координата x единичного круга.
- Синус угла является y-координатой единичного круга.
С cos(0) = 1 и sin(0) = 0 координата, соответствующая углу 0, равна (1, 0).

Независимо от того, находится ли 90 сверху или снизу, зависит от холста.
Некоторые приложения/фреймворки считают y-координату 0 находящейся в верхней части холста. Это означает, что вы двигаетесь по часовой стрелке вокруг круга, а 90 - внизу.
Если y-координата 0 находится в нижней части холста, вы идите против часовой стрелки, а 90 - вверху.

+0

Хорошее объяснение, спасибо. Я думал, что кратное -1 было конвертированием снизу вверх холста в верхний холст (используемый в C#). –

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

  • Нет связанных вопросов^_^