где косяк в функции пересечения луча и конуса (Python + линал :)

gsharov

Да, рейтрейсер на питоне это изврат, но по приколу можно :)
Это работает, но строит не конус а хрень какую то (со сферой разобрался) те косяк алгебраический...
Поможите, - где косяк в алгебре?
 class Cone(object):
"""docstring for Cone"""
def __init__(self, v,d,theta):
v.mustBePoint
d.mustBeVector
self.point = v
self.vector = d
self.theta = theta
def intersectionTime(self,ray):
"""docstring for intersectionTime"""
u=ray.point-self.point
a=ray.vector.dot(self.vector)**2-self.vector.magnitude**2*cos(self.theta)**2*ray.vector.magnitude**2
b=2*(ray.vector.dot(self.vector)*u.dot(self.vector) - u.dot(ray.vector)*self.vector.magnitude**2*cos(self.theta)**2)
c=u.dot(ray.vector)*self.vector.magnitude**2*cos(self.theta)**2
d=b**2-4*a*c
if d<0:
t=None
else:
t=[(-b-sqrt(d/2./a-b+sqrt(d/2./a]
p=[self.intersectionPoint(x,ray) for x in t]
pt=dict(zip(p,t
t=[pt[x] for x in filter(lambda x:self.inrange(xp)]
if len(t)==0:
t=None
else:
t=min(t)
return t
def intersectionPoint(self,t,ray):
if t==None:
p=None
else:
# print t
p=ray.point+ray.vector.scale(t)
return p
def inrange(self,p):
"""docstring for inrange"""
u=p-self.point
return u.magnitude*cos(self.theta)<=self.vector.magnitude
def normalAt(self,p):
"""docstring for normalAt"""
u=p-self.point
return u.cross(u.cross(self.vector

Serab

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

gsharov

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

zya369

те косяк алгебраический...
Поможите, - где косяк в алгебре?

если косяк в алгебре, то надо постить алгебру, т.е. формулы в чистом виде, а не в питоне :mad:

Dasar

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

Dmitriy82

Подход на мой взгляд неправильный. Лучше сделать сразу пересечение с квадратичной поверхностью общего вида. Проще, вероятность ошибок меньше.
offtop
[pt[x] for x in filter(lambda x:self.inrange(xp)]

вообще-то list comprehensions для того и нужны, чтобы не писать такой хуйни.

Petrovich_on_T3

Я бы ввёл удобную систему координат, скажем, ось 0z - это ось вращения конуса.
Ось 0y можно выбрать так, чтобы плоскость z0y была бы параллельна ЛУЧУ.
Тогда до отражения можно рассматривать ПЛОСКОСТЬ, проведённую через ЛУЧ параллельно к z0y. Сечение конуса этой ПЛОСКОСТЬЮ - некая гипербола - решается квадратное уравнение, находятся точки пересечения, если они есть.
А как ты решал?
Оставить комментарий
Имя или ник:
Комментарий: