LINUX.ORG.RU
Ответ на: комментарий от tazhate
aiv@aivbook:~/tmp$ cat galaxy.gp 
set parametric
plot [0:10*pi] t*cos(t), t*sin(t)
pause -1
aiv@aivbook:~/tmp$ 
AIv ★★★★★
()
Ответ на: комментарий от AIv

Хм, спиральки я рисовать умею, а вот как правильно сделать разброс точек по ней и допустим сделать несколько рукавов(2-3), вот это посложнее будет, немного.

deterok ★★★★★
() автор топика

Спирали ныне матан?

ρ(i) = k * (ϕ + f(i)) i = 1 .. n, n - кол-во спиралей в галактике, f(i)

На дискретных значениях ϕ рандомишь нужное кол-во точек - получится довольно реалистишно :)

malbolge ★★
()
Ответ на: комментарий от deterok
set parametric
set samples 20000
set size square
unset key
plot [0:10*pi] t**1.2*(cos(t)+.1*(rand(0)-.5)**3), t**1.2*(sin(t)+1.*(rand(0)-.5)**3) w dots, \
     -t**1.2*(cos(t)+.1*(rand(0)-.5)**3), -t**1.2*(sin(t)+1.*(rand(0)-.5)**3) w dots, \
     t**1.2*(sin(t)+.1*(rand(0)-.5)**3), -t**1.2*(cos(t)+1.*(rand(0)-.5)**3) w dots, \
     -t**1.2*(sin(t)+.1*(rand(0)-.5)**3), t**1.2*(cos(t)+1.*(rand(0)-.5)**3) w dots
pause -1

http://a-iv.ru/trash/galaxy.png

ну лучше конечно ф-ии ввести, я поленился... и можно сгенерить точек в dat-файл. Че та rand какие то странные корреляции в гнуплоте дает, ну я сним в общем не работал. И источник лучше гауссовый.

AIv ★★★★★
()
set sample 1000
set style function dots
set parametric
plot [0:10*pi] t*cos(t*2)+t*0.3*rand(0)+1, t*sin(t*2)+t*0.3*rand(1)+2
pause -1
Bad_ptr ★★★★★
()
Ответ на: комментарий от AIv

Сейчас, для теста, переписываю на python вот это:

float Gaussian() {
   // polar method of G. E. P. Box, M. E. Muller, and G. Marsaglia
   // See Knuth, ACP, Section 3.4.1 Algorithm C.
   static BOOL bNext = FALSE;
   static float next = 0;
   if ( bNext )  {  bNext = FALSE;  return next;   }

   float v1, v2, s;
   do {
      v1 = ufrand2();  // between -1 and 1
      v2 = ufrand2();  // between -1 and 1
      s = v1 * v1 + v2 * v2;
   } while ( s >= 1 || s == 0 );
   float multiplier = sqrtf( -2.f * logf(s) / s );
   next = v2 * multiplier;
   bNext = TRUE;
   return v1 * multiplier;
}


void SpiralGalaxy()
{
   for_i( nStars ) {
      ObjStar* obj = new Star;
      float ang = (Gaussian()+.5f) * Pi;
      float dist = expf( ang * .247f ) * 1000000000;  // спираль
      if ( urand(2) )  ang += Pi;     // второй рукав ( rand(2) возвращает 0 либо 1 )
      obj->pos.x = sinf(ang)*dist;
      obj->pos.z = cosf(ang)*dist;
      obj->pos += UVEC( Gaussian(), Gaussian(), Gaussian() ) * 200000000;  // разброс
      AddObj( obj );
   }
} 

Но я не понимаю, что значит UVEC?

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

Сейчас, для теста, переписываю на python вот это:

А что в итоге то надо? картинка? координаты «звезд» ?

AIv ★★★★★
()
Ответ на: комментарий от AIv

Картинку рисую для наглядности

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

Координаты

тогда не майтесь дурью:

Help on method gauss in module random:

gauss(self, mu, sigma) method of random.Random instance
    Gaussian distribution.
    
    mu is the mean, and sigma is the standard deviation.  This is
    slightly faster than the normalvariate() function.
    
    Not thread-safe without a lock around calls.

AIv ★★★★★
()
Ответ на: комментарий от AIv

Так, вот это уже на python:

from pylab import *

class galaxy(object):
	bNext = False
	nnext = 0
	
	def Gausian(self):
		if self.bNext:
			self.bNext = False
			return self.nnext
		v1 = uniform(-1, 1)
		v2 = uniform(-1, 1)
		s= v1*v1+v2*v2
		while s>=1 or s==0:
			v1 = uniform(-1, 1)
			v2 = uniform(-1, 1)
			s= v1*v1+v2*v2
		multiplier = sqrt(-2. * log(s) / s)
		self.nnext = v2 *multiplier
		self.bNext = True
		return v1 * multiplier
	
	def speral_galaxy(self, nStars):
		x =	[]
		y = []
		for i in xrange(nStars):
			ang = (self.Gausian()+.5) * np.pi
			dist = np.exp(ang * .247)*1000000000
			if randint(2):
				ang += np.pi
			x.append(sin(ang)*dist)
			y.append(cos(ang)*dist)
		return np.array(x),np.array(y)
				
if __name__ == '__main__':
	stars = 50000
	x, y = galaxy().speral_galaxy(stars)
	plot(x, y, 'bo')
	show()
И вот, что получается: [1] [2]

deterok ★★★★★
() автор топика
Ответ на: комментарий от AIv

Проблема теперь в том, что все звезды в линию выстраиваются, надо их как то раскидать немного. Какие коэффициенты подкрутить?

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

Б-г мой...

from random import gauss
from math import *
nstars = 10000 # number of starts
nlines = 3 
omega = 2*pi/1000
delta = 2*pi/nlines
sigma = .001
L = sum([ [ ( t*(gauss(0,sigma)+cos(omega*t+n*delta)), t*(gauss(0,sigma)+sin(omega*t+n*delta)), exp(-3*t/nstars)*gauss(0,sigma) ) 
            for n in range(nlines) ] for t in xrange(nstars)], [] )

dist наверное? Не знаю, какой то очень сложный у Вас алгоритм, многабукв.

AIv ★★★★★
()
Ответ на: комментарий от deterok

Тьфу, у Вас они и идут по одной линии, только с со случ источником в фазе. Добавть случ. источник в dist

AIv ★★★★★
()
Ответ на: комментарий от AIv

А можно подробнее, как влияют omega, delta и sigma на координаты, а то я запутался.

deterok ★★★★★
() автор топика
Ответ на: комментарий от AIv

Пока у меня получается неплохая эллиптическая галактика класса E7, рукава размазываются слишком сильно, а балдж массивен и занимает 1/3 объема всего объема.

deterok ★★★★★
() автор топика

Алгоритмы генерации галактики

Создатель, ты? На праздниках меньше надо было пить.

buddhist ★★★★★
()
Ответ на: комментарий от deterok

Вы не знаете ангема, а я не знаю астрономии;-)

К dist надо добавлять случ источник. Возможно, его амплитуда должна менятся по мере удаления от центра.

AIv ★★★★★
()
Ответ на: комментарий от AIv

Да я уже почти пришел к нужной консистенции. А ангем я 2 года назад последний раз «трогал».

deterok ★★★★★
() автор топика
Ответ на: комментарий от AIv

Ну понимаю, что не оправдание:)
Я понимаю, просто после работы думать никак не хочу, вот и туплю.
Завтра буду разбираться скорее всего.
Спасибо за помощь.

deterok ★★★★★
() автор топика
Ответ на: комментарий от Reset

Там же релятивисткая задача многих тел, не? Хотя для газа будет ГД...

На нормальном уровне - не то что слабо, а просто я такими вещами не занимался. На школьном... а зачем? У меня и так хватает задач. А Вам нужно с этим помочь? Если есть финансирование - обсуждаемо... ;-)

AIv ★★★★★
()
Ответ на: комментарий от deterok

А подробнее можно? Или это сарказм?

Люди на этом докторские пишутЪ, какой тут сарказм... как и на моделировании образования и эволюции звезд, моделировании сверхновых и т.д. Но это... сурово.

AIv ★★★★★
()
Ответ на: комментарий от deterok

Формулы есть в википедии, а чтобы только подступиться к этой задаче придется заботать риманову геометрию, тензорный анализ ну и, естественно, численные методы.

Reset ★★★★★
()
Ответ на: комментарий от deterok

А можно ссылку на эти формулы?

Лехко! гуглите/яндексите «численное моделирование образования галактик»

AIv ★★★★★
()
Ответ на: комментарий от Reset

Если будет финансирование или хотя бы куча свободного времени, то я и сам осилю :)

Нууу... если у меня вдруг будет куча свободного времени я... я... я асилю код для газодинамики горения для начала - остались там у меня хвосты;-)

Хотя астрофизика тоже интересна.

AIv ★★★★★
()
Ответ на: комментарий от AIv

Поправил коэффициенты, получил: http://ompldr.org/vZGx2Ng/1.png http://ompldr.org/vZGx2Nw/2.png http://ompldr.org/vZGx2OA/5.png http://ompldr.org/vZGx2OQ/10.png Название - число рукавов В каждой галактике =50000 точек, все дело в масштабе Ищу решение отрубания лишних(слишком далеко расположенных) точек, думаю сделать условие-коробку во время генерации + хотел бы найти быстродейственное решение поиска точек, которые слишком близко располагаются.

deterok ★★★★★
() автор топика
Ответ на: комментарий от slapin

Конечно можно, через пол часа на гит кину.

deterok ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.