Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.snto-msu.net/showflat.php?Number=9117695&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Tue Apr 12 14:07:01 2016
Кодировка: Windows-1251

Поисковые слова: magnitude
где косяк в функции пересечения луча и конуса (Python + линал :) - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 1
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
1

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

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
8


 
В ответ на:

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



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



Your touch will set me free
DarkGrayМодератор
Carpal Tunnel

Рег.: 30.09.2002
Сообщений: 31411
Рейтинг: 8952
  Re: где косяк в функции пересечения луча и конуса (Python + линал :) [re: Dantist]
      06.12.2009 01:32
1

Quote:

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




проверь максимально простые(вырожденные) случаи

например, конус в нуле радиуса 1,
лучи, проходящие через ноль
лучи, параллельные разным осям


Vlad
addict

Рег.: 18.09.2004
Сообщений: 446
Рейтинг: 236
  Re: где косяк в функции пересечения луча и конуса (Python + линал :) [re: Dantist]
      06.12.2009 12:14
7

Подход на мой взгляд неправильный. Лучше сделать сразу пересечение с квадратичной поверхностью общего вида. Проще, вероятность ошибок меньше.

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. Сечение конуса этой ПЛОСКОСТЬЮ - некая гипербола - решается квадратное уравнение, находятся точки пересечения, если они есть.

А как ты решал?



А жизнь хороша!
Страницы: 1

Technical >> Development (Archive)

Дополнительная информация
0 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в