Вычислить горизонт кривой поверхности? - Не экстремальное значение

Есть несколько хитростей, чтобы предотвратить ненужное повторное выполнение Oracle. Эта тема сложна, потому что 99,9% времени мы зависим от Oracle, чтобы автоматически переписать запросы для оптимальной работы. Остановка этих оптимизаций не должна быть обычной задачей.

Теоретически, нет способа гарантировать порядок операций декларативного оператора SQL. На практике есть два простых метода, которые могут помочь предотвратить повторный запуск функций: скалярное кеширование подзапроса и ROWNUM.

Во-первых, позвольте мне попытаться воспроизвести проблему. Ссылка на одно значение возвращает три разных числа.

create or replace function function_invocation return number is
begin
    return dbms_random.value;
end;
/

SELECT RESULT value1,
       RESULT value2,
       RESULT value3
  FROM (SELECT function_invocation() RESULT
          FROM dual);

VALUE1   VALUE2   VALUE3
------   ------   ------
0.3089   0.7103   0.2885

Переписывание запроса для использования скалярного подзапроса кажется ненужным, но эта форма позволяет Oracle использовать скалярное кеширование подзапроса, метод оптимизации, который использует Oracle, чтобы избежать повторного запуска кода. Теперь три столбца возвращают одно и то же значение.

select result value1, result value1, result value1
from
(
    select (select function_invocation() from dual) result from dual
);

VALUE1   VALUE2   VALUE3
------   ------   ------
0.2450   0.2450   0.2450

В качестве альтернативы, мы можем предотвратить оптимизационные преобразования, добавив псевдостолбец ROWNUM:

SELECT RESULT value1,
       RESULT value2,
       RESULT value3
  FROM (SELECT function_invocation() RESULT, rownum
          FROM dual);

VALUE1   VALUE2   VALUE3
------   ------   ------
0.1678   0.1678   0.1678

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

5
задан Community 23 May 2017 в 12:26
поделиться

3 ответа

Вы не говорите, как Ваша поверхность определяется, только что она ограничена двумя квадратичными кривыми Bézier. Существует много способов создать такую поверхность, и каждый способ создать ее имел бы различный горизонт. Таким образом, этот ответ будет догадками.

Горизонт состоит из тех точек на поверхности, где вектор от камеры до точки является касательной на поверхность, как показано здесь:

Tangent to Bézier curve

Квадратичная кривая Bézier имеет параметрическое уравнение

B (t) = (1 − t) 2 P0 + 2 (1 − t) t P1 + t2 P2 

дифференциация этого относительно t дает нам касательную кривой:

B ′ (t) = 2 (t  − 1) P0 + 2 (1 − 2 т) P1 +  P2 на 2 т

и это параллельно с вектором от камеры (в источнике) к кривой если

B (t) × B ′ (t) = 0

Решите это для t, и у Вас будет точка на кривой на горизонте. Как можно расшириться, это к горизонту для целой поверхности зависит от того, как поверхность создается. (Возможно, можно ли просто найти точки горизонта для кривых в каждом конце поверхности и присоединиться ли к ним с прямой линией?)

2
ответ дан 14 December 2019 в 19:27
поделиться

То, что Вы ищете, на самом деле называют контуром, не горизонтом.
Большая часть простого метода выполнения этого находит границу между поверхностными частями, в которых нормальное направлено к камере (скалярное произведение отрицательно), и поверхностные части, в которых нормальное направлено далеко от камеры (скалярное произведение положительно).

С треугольной сеткой можно сделать это непосредственно при помощи normals. с NURBS, можно, вероятно, найти закрытую формулу, которая делает это.

1
ответ дан 14 December 2019 в 19:27
поделиться

Это работает для первого вращения кривых так, чтобы соединение между вершинами было горизонтально и затем вычислило экстремальное значение?

Для тестирования его визуально можно повернуть изображение в качестве примера приблизительно на 150 градусов:

Повернутое изображение http://www.freeimagehosting.net/uploads/ad502509e9.png

Обратите внимание, что экстремальное значение этой кривой не точно, где Вы хотите это, но это могло быть вызвано несколькими факторами, например, способ, которым Вы отметили точки горизонта, кажется, не настолько точен.

2
ответ дан 14 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: