Приветствуем на Форум Херсона. Форум Херсонской молодежи.. На данный момент Вы находитесь на форуме как Гость и имеете очень ограниченные возможности и права. Что бы писать или отвечать в темах, загружать картинки, файлы на форуме Вам нужно зарегистрироваться, что совершенно бесплатно. Регистрация очень быстрая, не откладывайте эту процедуру! Если возникнут проблемы с регистрацией напишите нам. |
|
Программирование Все вопросы по написанию программ |
|
Опции темы |
24.08.2004, 22:51 | #1 (Ссылка на пост) | ||||||||
Свой В Доску
Благодарил(а): 0
Благодарили 9 раз в 8 постах
Галерея:
0
Вес репутации: 20
|
Как можно сделать проще?
Мне надо было найти угол между двумя точками на плоскости.
Я долго трахался и наконец написал функцию. Получилась она слишком большой и непонятной. Может кто-то знает, как можно проще найти угол между точками? В функцию передаются координаты точек. Вот она: function TForm1.getangle(x1,y1,x2,y2:integer):Integer; var a,b,angl,min:integer; esin,gipot:real; begin //У нас есть прямоуг. треугольник. Найдём его гипотенузу //это расстояние между известными точками gipot:=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); //На 0 делить нельзя, перестрахуемся if gipot=0 then gipot:=1; //Начинается бредовая проверка в зависимости от //координатных четвертей if y2 <=y1 then begin //Находим катет a:=x2-x1; //Находим синус угла esin:=a/gipot; //А теперь сам угол angl:=round(256/360*(radtodeg(arcsin(esin)))); end else// Здесь всё примерно так же. Без комментариев begin min:=90; a:=y2-y1; esin:=a/gipot; angl:=round(256/360*(radtodeg(arcsin(esin))+min)); if x2<x1 then begin min:=180; b:=x1-x2; esin:=b/gipot; angl:=round(256/360*(radtodeg(arcsin(esin))+min)); end; end; result:=angl; end; |
||||||||
|
27.08.2004, 22:36 | #2 (Ссылка на пост) | ||||||||
Свой В Доску
Благодарил(а): 0
Благодарили 9 раз в 8 постах
Галерея:
0
Вес репутации: 20
|
Кстати, если кому-то интересно, то если одна точка(не помню, какая
именно) находится в 4 четверти(слева и сверху) относительно второй, то функция возвратит отрицательное значение угла. Например, если у нас угол=200, она возвратит -55, т.к она возвращает угол от 0 до 255. Кто догадается что надо сделать, чтоб она показывала правильный угол? |
||||||||
|
28.08.2004, 15:11 | #3 (Ссылка на пост) | ||||||||
Свой В Доску
Благодарил(а): 0
Благодарили 9 раз в 8 постах
Галерея:
0
Вес репутации: 20
|
может я чегото не доганяю, но угол (!) между двумя точками?? это как? отностительно (0,0)? :roll:
|
||||||||
|
28.08.2004, 21:42 | #4 (Ссылка на пост) | ||||||||
Свой В Доску
Благодарил(а): 0
Благодарили 9 раз в 8 постах
Галерея:
0
Вес репутации: 20
|
Значит так. Пусть у нас есть две точки. Начало координат присобачим
к первой точке. Соединим точки линией. И вот эта прямая и какая-то из осей(x или y, не помню точно, а думать щас лень) образуют нужный нам угол. Иногда, чтоб получить првильный результат приходится к этому углу прибавлять 180 градусов. |
||||||||
|
21.03.2006, 22:24 | #5 (Ссылка на пост) | ||||||||
Задержался
Пол:
Благодарил(а): 1
Благодарили 5 раз в 4 постах
Галерея:
0
Вес репутации: 19
|
тут ты неправ насчет того, что появляется неправильный результат, дело в том что угол измеряется от оси Х допустим против часовой стрелки, так вот, если у тебя вторая точка относительно начала координат, лежит в четвертой четверти, то угол будет больше 270!!!! сответственно, а найти угол - очень просто, есть уравнение пучка прямых y = kx + b, где k - это тангенциальный коээфициент, т.е. tan(a), где а - искомый угол, b - смещение по оси y (т.к. прямая проходит через начало координат, то b = 0), отсюда у нас получается уравнение y = kx или что нам нужно k = y/x
находим k, подставив кординаты второй точки относительно первой, и находим арктангес этой величины - вот и искомый угол , правда в 1 и 3 четвертях, и 2 и 4 четвертях тангенсы совпадают, так что нужно делать проверку в какой четверти находится вторая точка. т.е. функция будет иметь такой вид (ха только заметил, почему используются целые числа для задания точек????) function TForm1.Angle(x1,y1,x2,y2: real):real; var x,y,k: real; begin x := x2 - x1; y := y2 - y1; if (x = 0) then if (y > 0) then result := 90.0 else result := 270; else if (y = 0) then if (x > 0) then result := 0 else result := 180; else begin k := arctan(abs(y/x)); if (x > 0) and (y < 0) then result := 360.0 - k else if (x < 0) and (y < 0) then result := 180.0 + k else if (x < 0) and (y > 0) then result := 90.0 + k; end; end; Спасибо за внимание |
||||||||
|
21.03.2006, 22:27 | #6 (Ссылка на пост) | ||||||||
Задержался
Пол:
Благодарил(а): 1
Благодарили 5 раз в 4 постах
Галерея:
0
Вес репутации: 19
|
Блин - поубирало все пробелы :( шо за ерунда????
ЗЫ. Учите математику пригодится |
||||||||
|
25.12.2006, 16:42 | #7 (Ссылка на пост) | |||||||||
Местные мы
Пол:
Благодарил(а): 32
Благодарили 113 раз в 88 постах
Галерея:
0
Вес репутации: 20
|
Цитата:
Например: Функция_которая_возвращает_угол( х, у) { return(ArcTangens(y/x)); } Функция_которая_возвращает_угол_между_двумя_точкам и(x1,x2,y1,y2) { if(Функция_которая_возвращает_угол( х1, у1)>Функция_которая_возвращает_угол( х2, у2)) { return(Функция_которая_возвращает_угол( х1, у1)-Функция_которая_возвращает_угол( х2, у2)); } else return(Функция_которая_возвращает_угол( х2, у1)-Функция_которая_возвращает_угол( х1, у1)); } З.Ы. Орфографии нет.. Просто смысловое умозаключение |
|||||||||
|
25.12.2006, 16:59 | #8 (Ссылка на пост) |
забанен
Мой дневник
Пол:
|
кому-то делать нечего )
вспомнил пост более полугодичной давности
__________________
|
|
25.12.2006, 17:13 | #9 (Ссылка на пост) | |||||||||
Местные мы
Пол:
Благодарил(а): 32
Благодарили 113 раз в 88 постах
Галерея:
0
Вес репутации: 20
|
Цитата:
|
|||||||||
|
25.12.2006, 17:23 | #10 (Ссылка на пост) | |
забанен
Мой дневник
Пол:
|
Цитата:
на, голову поломай
__________________
|
|
|
25.12.2006, 17:57 | #11 (Ссылка на пост) | |||||||||
Местные мы
Пол:
Благодарил(а): 32
Благодарили 113 раз в 88 постах
Галерея:
0
Вес репутации: 20
|
Цитата:
|
|||||||||
|
25.12.2006, 18:00 | #12 (Ссылка на пост) | |
забанен
Мой дневник
Пол:
|
Цитата:
всё равно кое-кому делать нечего )
__________________
|
|
|
25.12.2006, 18:17 | #13 (Ссылка на пост) | |||||||||
Местные мы
Пол:
Благодарил(а): 32
Благодарили 113 раз в 88 постах
Галерея:
0
Вес репутации: 20
|
Цитата:
|
|||||||||
|
25.12.2006, 18:21 | #14 (Ссылка на пост) | |
забанен
Мой дневник
Пол:
|
Цитата:
но это больше к теме Тема для желающих поучаствовать в конкурсе по программированию!
__________________
|
|
|
25.12.2006, 18:28 | #15 (Ссылка на пост) | |||||||||
Местные мы
Пол:
Благодарил(а): 32
Благодарили 113 раз в 88 постах
Галерея:
0
Вес репутации: 20
|
Цитата:
|
|||||||||
|
08.01.2007, 21:40 | #16 (Ссылка на пост) | ||||||||
АптИчески непразрачЕн.
Пол:
Адрес: Дома
Благодарил(а): 483
Благодарили 1,159 раз в 423 постах
Галерея:
0
Вес репутации: 30
|
Взял бы чЁто попроще...
типа пересечения тэтраидра сферой в полярных координатах 8))))
__________________
Меньше, чем где-либо, я претендую здесь на полноту, иначе мне пришлось бы повторить массу превосходных житейских правил, преподанных мудрецами разных времен, начиная с Феогниса и псевдо-Соломона и кончая Ларошфуко. Я буду излагать лишь то, что мне пришло на ум, показалось заслуживающим сообщения, и что, насколько мне не изменяет память, не было еще сказно, или, если и было, то не совсем так, я только подбираю колосья на необозримом, другими до меня сжатом, поле. |
||||||||
|
Здесь присутствуют: 1 (пользователей - 0 , гостей - 1) | |
Опции темы | |
|
|