Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.06;
Скачать: CL | DM;

Вниз

возведение в квадрат   Найти похожие ветки 

 
Green_Templar ©   (2005-05-20 00:29) [0]

Как в делфи грамотно возводить в квадрат?
Что лучше?
if exp(2*ln(abs(predator.x-prey.x) shr 3))+exp(2*ln(abs(predator.y-prey.y) shr 3))<=predator.eye then cansee1:=true else cansee1:=false;
или
((predator.x-prey.x) shr 3)*((predator.x-prey.x) shr 3)+((predator.y-prey.y) shr 3)*((predator.y-prey.y) shr 3)<=predator.eye then cansee1:=true else cansee1:=false;

Подскажите пожалуйста способ самого оптимального определения пересекаются ли круг и прямоугольник.


 
jack128 ©   (2005-05-20 00:40) [1]

а они оба работают?? ну тогда второй быстрее, конечно. в нём экспоненты и логорифма нету.


 
Green_Templar ©   (2005-05-20 03:48) [2]

Вах, канечно работают, только первый при подлогарифменном выражении равном нулю выдаёт сообщение о делении на 0.
Кто-нибудь знает хоть какой-нибудь способ как определить пересекаются ли круг и прямоугольник :) ?


 
Кщд ©   (2005-05-20 06:25) [3]

>Кто-нибудь знает хоть какой-нибудь способ как определить >пересекаются ли круг и прямоугольник :) ?

Решаем систему из 5-ти неравенств.
Если разрешима - пересекаются.
В чем сложность?


 
Думкин ©   (2005-05-20 07:21) [4]

Грамотно в Дельфи возводить в квадрат - sqr.


 
Экспериментатор   (2005-05-20 08:01) [5]

или Power из модуля math


 
Думкин ©   (2005-05-20 08:08) [6]

> [3] Кщд ©   (20.05.05 06:25)

Зачем 5 и систему? Соединяем центр окружности и центр квадрата. Находим пересечение отрезка и квадрата. Смотрим - принадлежит ли о кругу.
Или пересечения с окружностью - смотрим принадлежит ли квадрату.


 
Defunct ©   (2005-05-20 08:16) [7]

Думкин ©   (20.05.05 07:21) [4]

x * x


 
Думкин ©   (2005-05-20 08:17) [8]

> [7] Defunct ©   (20.05.05 08:16)

И что?


 
begin...end ©   (2005-05-20 08:18) [9]

> Экспериментатор   (20.05.05 08:01) [5]

Для возведения в квадрат всё же лучше Sqr.


 
Defunct ©   (2005-05-20 08:37) [10]

Думкин ©   (20.05.05 08:17) [8]

Обосновать чем x * x лучше sqr?


 
Думкин ©   (2005-05-20 08:39) [11]

> [10] Defunct ©   (20.05.05 08:37)

Ну да.


 
Думкин ©   (2005-05-20 08:44) [12]

>  [10] Defunct ©   (20.05.05 08:37)

В случае integer - похоже так, а в случае extended - не получается.


 
Defunct ©   (2005-05-20 08:49) [13]

Думкин ©   (20.05.05 08:39) [11]

Sqr это overload функция для разных типов, соответственно аргумент помещается в стек, внутри функции извлекается и повторно заноситмя в стек если аргумент с плавающей точкой. И того имеем как минимум:

1. вызов функции - занесение в стек EIP + извлечение EIP на выходе.
2. Резервирование в стеке места по результат: занесение результата в стек и извлечение из стека.
3. Занесение аргумента в стек и извлечение из стека.


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


 
Думкин ©   (2005-05-20 08:51) [14]

> [13] Defunct ©   (20.05.05 08:49)

Вы без всякого - сравните для extended оба варианта. Результаты сообщите. Хорошо?


 
begin...end ©   (2005-05-20 08:51) [15]

> Defunct ©   (20.05.05 8:49) [13]

Бред какой-то...


 
Defunct ©   (2005-05-20 08:54) [16]

Думкин ©   (20.05.05 08:51) [14]

А зачем даже сравнивать?
Вы что-то упускаете из виду CALL и RET


begin...end ©   (20.05.05 08:51) [15]
Ну если тебе не понятно, так что ж поделать.


 
Думкин ©   (2005-05-20 08:55) [17]

> [16] Defunct ©   (20.05.05 08:54)

А вы таки сравните. Вот я сравнил. sqr для extended - выиграл.


 
begin...end ©   (2005-05-20 08:56) [18]

> Defunct ©   (20.05.05 8:54) [16]

> Ну если тебе не понятно, так что ж поделать.

Я же уже говорил Вам: вначале смотрим в справку, потом в исходники, потом в CPU, и только потом вякаем.


 
Kerk ©   (2005-05-20 08:57) [19]

Defunct ©   (20.05.05 8:54) [16]
Вы что-то упускаете из виду CALL и RET


Нету там call/ret


 
Кщд ©   (2005-05-20 08:59) [20]

Думкин ©   (20.05.05 08:08) [6]

1. центр(пересечение диагоналей) прямоугольника: два простых выражения
2. отрезок, соединяющий центры: уравнение прямой
3. пересечение с прямоугольником: четыре системы(по числу сторон)
4. принадлежность пересечения отрезка с прямоугольником к кругу: неравенство

не ясно, чем - предложенный Вами - алгоритм лучше.
объясните?


 
Думкин ©   (2005-05-20 09:04) [21]

>  [20] Кщд ©   (20.05.05 08:59)

Объяснил бы. Кабы ваш видел. Или... вижу. А решать вашу систему? К тому же одно выражение нелинейное?

1. Зачем диагоналей? Сложить и поделить на 2. Даны вершины?
2. И ради бога
3. Ну можно подумать об оптимизации
4. вычслимое выражение - подставляем координаты пересечения в выражение и находим его знак.

:)


 
Defunct ©   (2005-05-20 09:07) [22]

Думкин ©   (20.05.05 08:55) [17]

Удивительно, но именно для Extended sqr почему-то работает быстрее причем примерно в 1.5 раза.


 
Думкин ©   (2005-05-20 09:10) [23]

3. И систем 4 нет. Будет одна система из 2-х уравнений. Надо только из 4 вариантов выбрать один. А это все решается с полуплоскостями. Что опять же вычислимые выражения. Есть только один момент - в ряде случаев будет 2 системы. Выбор определяется простым вычислением опять же.


 
Defunct ©   (2005-05-20 09:10) [24]

begin...end ©   (20.05.05 08:56) [18]

У меня нет времени разглядвать все это. И у меня нет комплексов если вдруг ошибусь.
Так что разглядывай и читай справку на здоровье все равно рано или позно забудешь.


 
SergP ©   (2005-05-20 09:10) [25]


> 1. центр(пересечение диагоналей) прямоугольника: два простых
> выражения
> 2. отрезок, соединяющий центры: уравнение прямой
> 3. пересечение с прямоугольником: четыре системы(по числу
> сторон)
> 4. принадлежность пересечения отрезка с прямоугольником
> к кругу: неравенство


ИМХО это неверно... круг с прямоуголником могут пересекаться, причем точка пересечения отрезков соединяющих центры с прямоугольником может и не принадлежать кругу...


 
Думкин ©   (2005-05-20 09:10) [26]

> [22] Defunct ©   (20.05.05 09:07)

Так CPU никто не скрывает. Можно посмотреть в суть "чуда". :)


 
Kerk ©   (2005-05-20 09:11) [27]

Удалено модератором
Примечание: AutoModerator


 
Думкин ©   (2005-05-20 09:13) [28]

>  [25] SergP ©   (20.05.05 09:10)

Для такого случая можно ввести 0 условие. Проверять, что центр круга в квадрате. Пойдет?


 
begin...end ©   (2005-05-20 09:13) [29]

> Defunct ©   (20.05.05 9:07) [22]

Вы в CPU всё-таки посмотрите. Оно рульно будет.
А когда где-нибудь в модулях существующих на данный момент версий Delphi найдёте "overload функцию" Sqr, выкопайте мой скелет -- я хоть посмотрю.

> Defunct ©   (20.05.05 9:10) [24]

У меня нет времени разглядвать все это.

Скорости проверить -- время есть, а на скомпилированный код посмотреть -- времени нет? LOL.

> И у меня нет комплексов если вдруг ошибусь.

У меня тоже.


 
SergP ©   (2005-05-20 09:16) [30]


>  [28] Думкин ©   (20.05.05 09:13)
> >  [25] SergP ©   (20.05.05 09:10)
>
> Для такого случая можно ввести 0 условие. Проверять, что
> центр круга в квадрате. Пойдет?


ИМХО не пойдет... Такой случай может быть даже когда центр круга будет за пределами прямоугольника


 
Думкин ©   (2005-05-20 09:17) [31]

> [30] SergP ©   (20.05.05 09:16)

?
Нарисуй если не трудно.


 
Думкин ©   (2005-05-20 09:18) [32]

> [30] SergP ©   (20.05.05 09:16)

Цыть. Точно. Извиняюсь. %) А было так просто. :)


 
Defunct ©   (2005-05-20 09:20) [33]

Kerk ©   (20.05.05 09:11) [27]
Вот ты и ddfg, задолбал. Я и так defunct что в переводе значит мертвый.

begin...end ©   (20.05.05 09:13) [29]
да здесь я оказался не прав, так что сорри.


 
Думкин ©   (2005-05-20 09:21) [34]

Тогда так.
01. Проверяем принадлежность центра квадрату
02. Одной из вершин кругу
Если ничего не вышло:
1. Ищем пересечения сторон квадрата с окружностью.

Вроде катит.


 
Кщд ©   (2005-05-20 09:24) [35]

Думкин ©   (20.05.05 09:04) [21]
возможно, я неточно выразился.
предлагал рещить четыре квадратных уравнения.
при наличии действительного корня(корней) у любого из них - пересечение имеет место.


 
SergP ©   (2005-05-20 09:25) [36]


>  [31] Думкин ©   (20.05.05 09:17)
> > [30] SergP ©   (20.05.05 09:16)
>
> ?
> Нарисуй если не трудно.


нарисовать проблематично... Выложить некуда..

Но описать - например такая ситуация:
Имеем квадрат и круг. Центр круга лежит на продолжении одной из сторон квадрата, причем расстояние от квадрата до центра круга только чуть (незначительно) меньше радиуса круга.
поллучится что квадрат и круг пересекаются, но толчка пересечения отрезка соединяющего центры с прямоугольником не будет принадлежать кругу


 
Думкин ©   (2005-05-20 09:27) [37]

> [35] Кщд ©   (20.05.05 09:24)

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


 
Думкин ©   (2005-05-20 09:28) [38]

>  [36] SergP ©   (20.05.05 09:25)

Да я нарисовал уже. :) См.
> [32] Думкин ©   (20.05.05 09:18)


 
Кщд ©   (2005-05-20 09:29) [39]

Кщд ©   (20.05.05 09:24) [35]
+ как верно заметил SergP, проверка на принадлежность центра круга - прямоугольнику. :)


 
Думкин ©   (2005-05-20 09:31) [40]

>  [39] Кщд ©   (20.05.05 09:29)

Разве он это заметил? Не только. Квалрат может целиком лежать в круге и центр второго не лежать в квадрате.


 
Думкин ©   (2005-05-20 09:34) [41]

> [36] SergP ©   (20.05.05 09:25)

А рисунок так делается:
1. Берем квадрат. Ставим его на сторону.
2. Сверху на угол - колесо, так чтобы его цент не лежал на продолжении диагонали.
3. Соединяем центры - пересечения с фигурами в соседях не лежат.
4. Немного увеличиваем радиус.


 
Кщд ©   (2005-05-20 09:35) [42]

Думкин ©   (20.05.05 09:27) [37]
>И после нахождения пересечений надо проверить, что они принадлежат >не только прямым образующим квадрат, но и его стороне.

вот поэтому и неравенста

в общем, частный, элементарный случай геом. vs алг. подхода, имхо.
господин Думкин, матфак?


 
Defunct ©   (2005-05-20 09:35) [43]

> Подскажите пожалуйста способ самого оптимального определения пересекаются ли круг и прямоугольник.

1. Сделать грубую проверку. Круг представить в виде квадрата. Алгоритм определения пересечений двух прямоугольников прост и быстр.

2. Если грубая проверка пройдена и прямоугольники пересекаются, тогда делать более тщательную.


 
Кщд ©   (2005-05-20 09:37) [44]

Думкин ©   (20.05.05 09:31) [40]
да, поторопился.
конечно же, там взаимная проверка.


 
Думкин ©   (2005-05-20 09:39) [45]

> [42] Кщд ©   (20.05.05 09:35)

Ну понятно. Бум считать что решили.
И он тоже - ММФ. Ты вроде там же? Я тебе в Асю стучусь.


 
Кщд ©   (2005-05-20 09:40) [46]

ещё вариант:
1. Проверка на вложенность друг в друга
2. 4 выражения на кратчайшее расстояние от прямой до точки
3. если минимум одно <= радиусу, то пересечение


 
Чапаев ©   (2005-05-20 10:35) [47]

> Думкин
> Defunct
Sqr(x) лучше x*x в данном случае потому, что доступ к полям Predator & Prey осуществляется ОДИН раз...


 
Green_Templar ©   (2005-05-20 12:58) [48]

Поправочка: прямоугольник паралелен сторонам экрана.
Мой алгоритм самый крутой :)
Ищем минимальное расстояние до прямоугольника, если оно меньше или равно радиусу, то пересекаются, иначе нет. Впрочем, лучше сами посмотрите :)

function intersectcandrect(var top,right,bottom,left,x,y,r:integer):boolean;
var minx,miny:integer;
begin
if (top<=y) and (bottom>=y) then miny:=0 else if abs(y-top)<abs(bottom-y) then miny:=abs(y-top) else miny:=abs(bottom-y);
if (left>=x) and (right<=x) then minx:=0 else if abs(x-left)<abs(right-x) then minx:=abs(x-left) else minx:=abs(right-x);
if sqrt(sqr(minx)+sqr(miny))<=r then intersectcandrect:=true else intersectcandrect:=false;
end;

Кому нужно могу выслать пример, иллюстрирующий работоспособность алгоритма.


 
Думкин ©   (2005-05-20 15:36) [49]

> [47] Чапаев ©   (20.05.05 10:35)

Этого же эффекта можно достичь иным способом. Речь была все-таки видимо не о данном конкретном случае со сложным выражением. Во-всяком случае, в нашей с Defunct"ом дискуссии.

> Поправочка: прямоугольник паралелен сторонам экрана.
> Мой алгоритм самый крутой :)

Расстояние от центра окружности?
Рассмотрим случай, когда окружность опирается на угол и центр окружности, вершина соответствующая и центр квадрата - на одной прямой. Потом немного сдвинем окружность в сторону центра. Пересечение налицо. Но что скажет ваш алгоритм? А ведь истинное расстояние от вашего - отличается.


 
SergP.   (2005-05-20 17:00) [50]

Кстати хотелось бы уточнить:
Имеется ввиду пересечение контуров или наличие обших площадей?
Вобще-то по тому что в условии было сказано "круг" а не "окружность" я так понял что имеется ввиду все-таки наличие общих площадей.
Но кто его знает что хотел автор... Вдруг он неправильно выразился?


 
Green_Templar ©   (2005-05-20 18:49) [51]

Расстояние от центра окружности?
Да.
Но что скажет ваш алгоритм?
Мой алгоритм скажет "пересекаются". Специально для вас высылаю на мыло :)
Имеется ввиду пересечение контуров или наличие обших площадей?
Площадей.


 
Думкин ©   (2005-05-21 04:35) [52]

> Green_Templar ©   (20.05.05 18:49) [51]

Вчера видимо был майский перегрев. Осознал. Каюсь. Посыпаю голову пеплом. :)

В отпуск пора - народ вон в Потрепаться хвастает. А ждать июля. :)


 
ferr ©   (2005-05-21 13:30) [53]

if sqrt(sqr(minx)+sqr(miny))<=r then intersectcandrect:=true else intersectcandrect:=false;
фтопку...
 Result:=sqr(minx)+sqr(miny)<=r*r;
Посчитайтей выйгрыш...



Страницы: 1 2 вся ветка

Текущий архив: 2005.06.06;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.05 c
9-1110436166
boalse
2005-03-10 09:29
2005.06.06
Покажите своё лучшее!


1-1116705208
Просто Джо
2005-05-21 23:53
2005.06.06
Полная форма inherited


4-1113551470
Ola
2005-04-15 11:51
2005.06.06
Подскажите новичку где почитать про потоки: создание и работа...


4-1113663236
Gaffer
2005-04-16 18:53
2005.06.06
Создание расширения


5-1087272276
Sun bittern
2004-06-15 08:04
2005.06.06
Проблема с событием OnPaint :(