Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Повернуть линию на угол, зная координаты 2-х точек 
V
    Опции темы
Moid
Дата 17.3.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: 2
Всего: 3



Линия состоит из 2-х точек, нужно повернуть 2-ю на некоторый угол. 
Пытался так:

Код

                angle = (Math.PI / 180) * value;
                double x;
                double x1 = _a.Point1.X;
                double y;
                double y1 = _a.Point1.Y;

                x = ((x1 * Math.Cos(angle)) - (y1 * Math.Sin(angle)));
                y = ((x1 * Math.Sin(angle)) + (y1 * Math.Cos(angle)));


не работает.

Подскажите где ошибка.


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
vponomarov
Дата 17.3.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 4
Всего: 12



по-моему, должно быть так:
Код

x = ((x1 * Math.Cos(angle)) + (y1 * Math.Sin(angle)));
y = -((x1 * Math.Sin(angle)) + (y1 * Math.Cos(angle)));


где x, y - старые координаты;
x1, y1 - новые координаты

Это сообщение отредактировал(а) vponomarov - 17.3.2008, 15:35


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Moid
Дата 17.3.2008, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: 2
Всего: 3



Цитата

vponomarov,


не работает.


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
vponomarov
Дата 17.3.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 4
Всего: 12



а что конкретно не работает?
можно какие-нить подробности, больше кода?


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Moid
Дата 17.3.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: 2
Всего: 3



вот весь метод:

Код

public float Angle
        {
            get { return angle; }
            set 
            {
                angle = (float)(Math.PI / 180) * value;
                double x;
                double x1 = _a.Point1.X;
                double y;
                double y1 = _a.Point1.Y;

               // x = ((x1 * Math.Cos(angle)) - (y1 * Math.Sin(angle))) + _a.Point2.X;
               // y = ((x1 * Math.Sin(angle)) - (y1 * Math.Cos(angle))) + _a.Point2.Y;

                //x = (((_a.Point2.X - x1) * Math.Cos((Math.PI / 180) * angle)) - ((_a.Point2.Y - y1) * Math.Sin((Math.PI / 180) * angle))) + _a.Point2.X;
                //y = (((_a.Point2.X - x1) * Math.Sin((Math.PI / 180) * angle)) + ((_a.Point2.Y - y1) * Math.Cos((Math.PI / 180) * angle))) + _a.Point2.Y;

                x = ((x1 * Math.Cos(angle)) + (y1 * Math.Sin(angle)));
                y = -((x1 * Math.Sin(angle)) + (y1 * Math.Cos(angle)));

                _a.Point2.X = (float)x;
                _a.Point2.Y = (float)y;
            }
        }



Длинна линии меняется(а должна оставаться неизменной) и смещается в неправильном направлении и градусе.


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
vponomarov
Дата 17.3.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 4
Всего: 12



тебе нужно писать:
Код

double x = _a.Point2.X * Math.Cos(angle) + _a.Point2.Y * Math.Sin(angle);
double y = -_a.Point2.X * Math.Sin(angle) + _a.Point2.Y * Math.Cos(angle);
_a.Point2 = new Point((int)x, (int)y);

и все будет ок smile 


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
vponomarov
Дата 17.3.2008, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 4
Всего: 12



хотя нет, это я стормозил! эти формулы применяются для поворота системы координат!
сейчас подумаю...


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Moid
Дата 17.3.2008, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: 2
Всего: 3



vponomarov,


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


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
vponomarov
Дата 17.3.2008, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 4
Всего: 12



ну вроде работает smile 
Код

            double angle = Math.PI * 30 / 180;
            double x = a1.X+ (a2.X-a1.X) * Math.Cos(angle) + (a2.Y-a1.Y) * Math.Sin(angle);
            double y = a1.Y-(a2.X -a1.X)* Math.Sin(angle) + (a2.Y -a1.Y)* Math.Cos(angle);
            a2 = new PointF((float)x, (float)y);



--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Moid
Дата 17.3.2008, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: 2
Всего: 3



Спасибо, работает  smile !

Добавлено через 10 минут и 15 секунд
Только, 

как повернуть относительно нулевых координат, а не текущего положения?


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
Moid
Дата 17.3.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: 2
Всего: 3



Хотя..., скорее всего это изза моего класса глюки.
Все Гуд! 
Спасибо.


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
Moid
Дата 18.3.2008, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: 2
Всего: 3



А как теперь сделать обратное, зная 2 точки узнать угол?

Добавлено через 4 минуты и 4 секунды
(не по четвертям а в 360 градусов).

по четвертям так сделал:
Код

float tgAlh = (_a.Point2.X - _a.Point1.X) / (_a.Point2.Y - _a.Point1.Y);
double angle = (Math.Atan2(tgAlh) * 180) / Math.PI;



--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
vponomarov
Дата 18.3.2008, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 4
Всего: 12



Цитата

А как теперь сделать обратное, зная 2 точки узнать угол?

угол между чем и чем?


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Moid
Дата 18.3.2008, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: 2
Всего: 3



Между осью Х с Y = значению неподвижной точки

Добавлено через 6 минут и 32 секунды
user posted image


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
vponomarov
Дата 18.3.2008, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 4
Всего: 12



первое, что приходит в голову: определяешь величину острого угла через значение tg(y/x), а потом в зависимости от знаков sin и cos прибавляешь 0, 90, 180 градусов.
хотя возможно есть более элегантное решение smile 


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0892 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.