Текущий архив: 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)
Разве он это заметил? Не только. Квалрат может целиком лежать в круге и центр второго не лежать в квадрате.
Страницы: 1 2 вся ветка
Текущий архив: 2005.06.06;
Скачать: CL | DM;
Память: 0.56 MB
Время: 0.055 c