Dantist
|
Серый волк
|
|
|
|
Рег.: 12.11.2003
|
Сообщений: 1331
|
|
Рейтинг: 19
|
|
где косяк в функции пересечения луча и конуса (Python + линал :)
05.12.2009 01:42
|
|
|
Да, рейтрейсер на питоне это изврат, но по приколу можно Это работает, но строит не конус а хрень какую то (со сферой разобрался) те косяк алгебраический... Поможите, - где косяк в алгебре? code: 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(x),p)]
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))
|
Самурай без меча подобен самураю с мечом, но только без меча.
|
|
unkulunkulu
|
unkulunkulunkulu
|
|
|
|
Рег.: 12.11.2006
|
Сообщений: 18453
|
Из: 13000
|
Рейтинг: 11759
|
|
Re: где косяк в функции пересечения луча и конуса (Python + линал :)
[re: Dantist]
05.12.2009 01:53
|
|
|
В подобных случаях поступают следующим образом: рисуешь какой-нибудь простецкий конус на бумаге, прикидываешь, что там чему должно быть равно. Вгоняешь тест, если результат неправильный - отлаживаешь по шагам.
|
|
Dantist
|
Серый волк
|
|
|
|
Рег.: 12.11.2003
|
Сообщений: 1331
|
|
Рейтинг: 19
|
|
Re: где косяк в функции пересечения луча и конуса (Python + линал :)
[re: unkulunkulu]
05.12.2009 02:31
|
|
|
есть такой метод Рисовал, да - по шагам сложно. Вроде формулы правильные а получается фигня В смысле программинг тут наверное ни при чем - я походу на бумаге неправильно решил. Забыл уж этот линал нафиг.
|
Самурай без меча подобен самураю с мечом, но только без меча.
|
|
nelapsi
|
the wumbologist
|
|
|
|
Рег.: 10.11.2003
|
Сообщений: 10758
|
Из: Orbis Tertius
|
Рейтинг: 10651
|
|
Re: где косяк в функции пересечения луча и конуса (Python + линал :)
[re: Dantist]
06.12.2009 00:58
|
|
|
В ответ на:
те косяк алгебраический... Поможите, - где косяк в алгебре?
если косяк в алгебре, то надо постить алгебру, т.е. формулы в чистом виде, а не в питоне
|
Your touch will set me free |
|
DarkGray
|
Carpal Tunnel
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 31411
|
|
Рейтинг: 8952
|
|
Re: где косяк в функции пересечения луча и конуса (Python + линал :)
[re: Dantist]
06.12.2009 01:32
|
|
|
Quote:
есть такой метод Рисовал, да - по шагам сложно. Вроде формулы правильные а получается фигня В смысле программинг тут наверное ни при чем - я походу на бумаге неправильно решил. Забыл уж этот линал нафиг.
проверь максимально простые(вырожденные) случаи
например, конус в нуле радиуса 1, лучи, проходящие через ноль лучи, параллельные разным осям
|
|
Vlad
|
addict
|
|
|
|
Рег.: 18.09.2004
|
Сообщений: 446
|
|
Рейтинг: 236
|
|
Re: где косяк в функции пересечения луча и конуса (Python + линал :)
[re: Dantist]
06.12.2009 12:14
|
|
|
Подход на мой взгляд неправильный. Лучше сделать сразу пересечение с квадратичной поверхностью общего вида. Проще, вероятность ошибок меньше.
offtop
code: [pt[x] for x in filter(lambda x:self.inrange(x),p)]
вообще-то list comprehensions для того и нужны, чтобы не писать такой хуйни.
|
|
Salute
|
космонавт
|
|
|
|
Рег.: 09.05.2004
|
Сообщений: 2018
|
Из: Moscow
|
Рейтинг: 41
|
|
Re: где косяк в функции пересечения луча и конуса (Python + линал :)
[re: Dantist]
06.12.2009 16:48
|
|
|
Я бы ввел удобную систему координат, скажем, ось 0z - это ось вращения конуса. Ось 0y можно выбрать так, чтобы плоскость z0y была бы параллельна ЛУЧУ. Тогда до отражения можно рассматривать ПЛОСКОСТЬ, проведенную через ЛУЧ параллельно к z0y. Сечение конуса этой ПЛОСКОСТЬЮ - некая гипербола - решается квадратное уравнение, находятся точки пересечения, если они есть.
А как ты решал?
|
А жизнь хороша! |
|