- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
struct Point
{
double x,y,z;
Point()
{
L1:
x=Rand();
y=Rand();
z=Rand();
double r=sqrt(x*x+y*y+z*z);
if(r<eps)
goto L1;
x/=r;
y/=r;
z/=r;
}
...
};
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+65.3
struct Point
{
double x,y,z;
Point()
{
L1:
x=Rand();
y=Rand();
z=Rand();
double r=sqrt(x*x+y*y+z*z);
if(r<eps)
goto L1;
x/=r;
y/=r;
z/=r;
}
...
};
guest 03.01.2010 01:10 # 0
guest 03.01.2010 01:31 # +2
guest 03.01.2010 02:28 # −2
brainiac 03.01.2010 02:53 # 0
Можно добавить сомнительное поведение конструктора по-умолчанию, и кривой алгоритм.
guest 03.01.2010 04:33 # 0
guest 03.01.2010 04:45 # −1
Используя тот факт, что самописный Rand() в этом проекте возвращает число от -1 до 1. Кстати, реализация -- отдельная фиерия, может даже стоит выложить еще одним говнокодом...
brainiac 03.01.2010 04:52 # 0
Или даже, дабы устранить неявности,
p.x = r*Rand();
p.y = r*Rand();
p.z = sqrt(r*r - x*x - y*y);
тогда r можно менять, или передать параметром
guest 03.01.2010 05:00 # 0
brainiac 03.01.2010 05:07 # +1
guest 03.01.2010 14:15 # 0
Заметь, здесь нет циклов вообще: ни через do-while, ни через goto.
brainiac 03.01.2010 15:46 # 0
brainiac 03.01.2010 15:57 # 0
guest 03.01.2010 18:17 # 0
guest 10.01.2010 05:21 # 0
ежу понятно, что r*r - x*x - y*y может запросто быть отрицательным числом.
guest 03.01.2010 13:30 # 0
brainiac 03.01.2010 15:51 # 0
А, и да. Оно возвращает даббл между -1 и 1 еще. Вот, наслаждайтесь:
guest 03.01.2010 16:54 # +1
guest 03.01.2010 17:26 # 0
brainiac 03.01.2010 18:16 # +1
Вот вариант получше, к тому же равномерно распределяющий точку по поверхности сферы:
TarasB 03.01.2010 18:30 # 0
guest 03.01.2010 19:26 # −1
brainiac 03.01.2010 19:33 # 0
Да и тормозов никаких не будет. С SSE2 что синус, что косинус вычисляется меньше, чем за 100 тактов, не уверен, что рандом сильно быстрее, или что конструирование объекта сильно быстрее, или что алгоритм, которому понадобилось кидать рандомные точки, сильно быстрее. В конце концов, алгоритм может банально быстрее сойтись на качественных начальных точках.
guest 04.01.2010 08:58 # 0
TarasB 04.01.2010 14:21 # 0
Подсказка - посмотри, что получается в плоскости YZ.
Проецируя точку, равномерно распределённую на отрезке, на полуокружность, мы не получим равномерного распределения.
guest 03.01.2010 03:39 # 0
guest 03.01.2010 04:12 # 0
guest 03.01.2010 14:18 # 0
guest 03.01.2010 03:46 # +2
1)goto.
2)Это вектор, а назвали point(точка).
3)Сдесь конструктор по умолчанию пытаеться получить значения случайного нормированного вектора.
4)Алгоритм может зациклиться во время полной луны в полночь или ещё когда-нибудь .
5)if(r<eps) - у меня есть подозрения, что на границе точности эпсилиона уже будет невозможно сравнивать и мы или получим исключение или получем не верное значение.
6)Оно точно поделиться, если когда условие r=eps? Тут или мы получим бредовое значение или исключение.
guest 03.01.2010 04:31 # 0
п.2 У вектора нет радиуса точки назначения (r). ;-) Здесь сфера с указанием на нее единичного вектора.
п.3 см п.2
п.4 - а можно поразвернутее? В каких именно случаях? r/eps - вроде решает проблему?
п.5, п.6 - В том то и дело, что eps восприниматься однозначно. Мы получим единичный вектор. Проверьте ;-)
P.S. Хотя я назвал вектора единичными, их скорее стоило именовать базовыми. Воть... Теперь все.
guest 03.01.2010 04:44 # 0
п.2, п.3 - ты правильно сказал. :-)
brainiac 03.01.2010 05:10 # 0
TarasB 03.01.2010 18:23 # +1
p.x = Rand();
p.y = Rand();
p.z = sqrt(r*r - x*x - y*y);
Почему?
Во-первых, если и x и y вдруг окажутся близки к единице, то нам придётся извлекать корень из отрицательного числа.
А ещё, потому что вместо случайной точки, равномерно распределённой по сфере (нам ведь это надо?) имеем проекцию на полусферу точки, равномерно распределённой по... квадрату?
TarasB 03.01.2010 18:28 # +1
То есть координату z можно взять как просто рандом.
Далее, берём случайное число, равномерно распределённое на отрезке от -п до п, получая аргумент проекции нужной точки на плоскость XY.
Вот так где-то:
p.z = Rand();
r = sqrt(1-sqr(p.z));
arg = Pi*Rand();
p.x = r*cos(arg);
p.y = r*sin(arg);
brainiac 03.01.2010 18:40 # +1
TarasB 03.01.2010 19:51 # 0
Тогда так (чтобы без цикла, и чтобы делалось ровно то же, что в исходном коде): случайный вектор из куба по направлению распределён так же, как случайный вектор на поверхности куба. То есть сначала можно взять случайное число от 1 до 6, потом - случайную точку в квадрате, потом, в зависимости от случая, клеить её на соответствующую сторону и делить.
brainiac 03.01.2010 19:58 # 0
guest 04.01.2010 09:01 # 0
Ой ли? Где про это можно почитать?
TarasB 04.01.2010 14:17 # 0
guest 05.01.2010 02:01 # 0
Это с чего вдруг?
Есть одна маленькая просьба: тервер расписывать более формально.
TarasB 05.01.2010 14:10 # 0
guest 05.01.2010 09:31 # +1
guest 05.01.2010 09:33 # −1