C # Нарисуйте идеальную сферу от центра (x, y, z) до крайнего (x, y, z) внутри трехмерного пространства сетки - PullRequest
0 голосов
/ 16 декабря 2010

У меня есть значения для следующих переменных:

x0, y0, z0 = координаты первого выделения (предполагается, что это центр сферы)

x1, y1, z1 = координатывторого выбора (предназначенного быть самой внешней точкой для сферы)

ishollow = логическое значение, указывающее, должна ли сфера быть полой

Результат должен нарисовать, насколько это возможно, идеальныйсфера.Вот пример:

  • 3D пространство 100x100x100
  • точка 50,50,50 выбрана первой (то есть x0 = 50; y0 = 50, z0 = 50)
  • точка 76,67,84 выбирается второй (т. Е. X1 = 76; y1 = 67, z1 = 84)
  • сфера рисуется с первой точкой в ​​качестве центра и второй точкой как наибольшим расстоянием любой точкив сфере из центра
  • сфера должна состоять из точек, построенных с помощью функции markpointt (x, y, z, пустая отметка)
  • сфера должна быть полой, если ishollow = true.чтобы сделать его пустым, мне нужно указать, является ли пустая метка истинной, если так, то точка все еще должна быть размещена, но она переопределяет любые существующие точки с черной точкой

Я не был уверен, с чего начать, могуВы указываете мне направление идентификации математических функций для кодирования такого процесса?Заранее благодарю за помощь.

Ответы [ 2 ]

1 голос
/ 16 декабря 2010

Первая величина, которую вы должны вычислить - это радиус сферы. Это просто, используя вашу запись radius = sqrt((x1-x0)^2+(y1-yo)^2+(z1-z0)^2).

Затем, чтобы «закрасить» всю сферу, вы можете просто перебрать каждый воксель в вашем 100 x 100 x 100 пространстве и проверить, находится ли он внутри сферы, или раскрасить его соответствующим образом. Есть много способов сделать эту операцию более эффективной, например, вы можете сначала определить выравнивающий ось ограничивающий прямоугольник для сферы и выполнять итерации только по точкам в этом блоке. Вы можете сделать все свои вычисления в одном октанте пространства, а затем использовать отражение для раскраски в других октантах.

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

Если вы находите концептуализацию всего этого немного изнурительной, отработайте все для круга в 2D, прежде чем заняться 3-м измерением.

1 голос
/ 16 декабря 2010

Расстояние между точками = радиус сферы.

(центральное положение) & (радиус сферы) - все, что вам нужно.Вы можете проверить, находится ли точка внутри сферы, если ее расстояние до центра меньше радиуса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...