Страница: 1 |
Страница: 1 |
Вопрос: Движение звёзд
Добавлено: 28.02.07 12:04
Автор вопроса: sabeshkin
Народ, кто знает, поделитесь пожалуста мыслями. Проблема в том что нам по комп. графике дали задание нарисовать звёздное небо, но после прорисовки random-ом звёзд надо чтобы они стали сходиться или же расходиться из определённой точки экрана. Может кто уже рисовал такую вещь, мне хотябы алгоритм узнать, ато уж больно нудно изобретать велосипед заново, ведь наверняка алгоритм уже прорабатывали. Ну а если ещё и код подкинете (желательно на VB.NET или C#, ну накрайняк на Turbo Pascal) то вообще будет просто супер.
Заранее большое спасибо!
Ответы
Всего ответов: 8
Номер ответа: 1
Автор ответа:
Visual Basic .NET 2005 Пиратская версия
Вопросов: 38
Ответов: 190
Web-сайт:
Профиль | | #1
Добавлено: 28.02.07 15:11
Качай с rusprojects.narod.ru в разделе .НЕТ графика Падал прошлогодний снег. Там все есть с открытым исходником и музыкой
Номер ответа: 2
Автор ответа:
D o c a l
ICQ: 408802757
Вопросов: 76
Ответов: 985
Web-сайт:
Профиль | | #2
Добавлено: 28.02.07 17:46
Постав ето на годую форму
Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Const m = 1000
Const mult = 400
Private x(m, 10), y(m, 10), z(m, 10) As Single
Private xr(m), yr(m), f(m), zr(m) As Integer
Private z0, y0, x0, zs, ax, ay, az, n, xmax, ymax, t, t1, st, st0, st1 As Single
Private typ, n_t
Private Sub Form_Activate()
xmax = ScaleWidth
ymax = ScaleHeight
n = 1: t = 1: t1 = 1
x0 = 1: y0 = 0: z0 = -20
zs = 2
ax = 0: ay = 0: az = 0
st0 = 100
st = 0
typ = 0
n_t = 6
''''''''''''''''''''''''''''''''''''''''
n = 1
For i = 0 To 5 Step 0.2
x(n, t) = 0: y(n, t) = i: z(n, t) = 0
n = n + 1
x(n, t) = -i: y(n, t) = -i: z(n, t) = i
n = n + 1
x(n, t) = i: y(n, t) = -i: z(n, t) = i
n = n + 1
x(n, t) = i: y(n, t) = i: z(n, t) = i
n = n + 1
x(n, t) = i: y(n, t) = i: z(n, t) = -i
n = n + 1
x(n, t) = i: y(n, t) = -i: z(n, t) = -i
n = n + 1
x(n, t) = -i: y(n, t) = -i: z(n, t) = -i
n = n + 1
x(n, t) = -i: y(n, t) = i: z(n, t) = -i
n = n + 1
x(n, t) = -i: y(n, t) = -i: z(n, t) = -i
n = n + 1
Next
'''''''''''''''''''''''''''''''''''''''
t = 2
For i = 1 To 300
x(i, t) = Int(Rnd * 20) - 10
y(i, t) = Int(Rnd * 20) - 10
z(i, t) = Int(Rnd * 20) - 10
Next
Print n
''''''''''''''''''''''''''''''''''''
t = 3
n = 1
For i = -5 To 5 Step 0.5
x(n, t) = i: y(n, t) = -5: z(n, t) = 5
n = n + 1
x(n, t) = i: y(n, t) = -5: z(n, t) = -5
n = n + 1
x(n, t) = i: y(n, t) = 5: z(n, t) = 5
n = n + 1
x(n, t) = i: y(n, t) = 5: z(n, t) = -5
n = n + 1
x(n, t) = 5: y(n, t) = i: z(n, t) = 5
n = n + 1
x(n, t) = 5: y(n, t) = i: z(n, t) = -5
n = n + 1
x(n, t) = -5: y(n, t) = i: z(n, t) = 5
n = n + 1
x(n, t) = -5: y(n, t) = i: z(n, t) = -5
n = n + 1
x(n, t) = 5: y(n, t) = 5: z(n, t) = i
n = n + 1
x(n, t) = -5: y(n, t) = 5: z(n, t) = i
n = n + 1
x(n, t) = 5: y(n, t) = -5: z(n, t) = i
n = n + 1
x(n, t) = -5: y(n, t) = -5: z(n, t) = i
n = n + 1
Next
'''''''''''''''''''''''''''''''''''''''''
n = 1
t = 4
For i = 0 To 6 - 1
For j = 0 To 6
Call pset_line(Cos(i * 6.28 / 6), Sin(i * 6.28 / 6), Cos(j * 6.28 / 6), Sin(j * 6.28 / 6), 6, 5)
Next
Next
'''''''''''''''''''''''''''''''''''''''''
n = 1
t = 5
For i = 0 To 10 Step 0.3
x(n, t) = i - 5: y(n, t) = -5: z(n, t) = -5
n = n + 1
x(n, t) = i - 5: y(n, t) = -5: z(n, t) = 5
n = n + 1
x(n, t) = 5: y(n, t) = -5: z(n, t) = i - 5
n = n + 1
x(n, t) = -5: y(n, t) = -5: z(n, t) = i - 5
n = n + 1
x(n, t) = 5 - i / 2: y(n, t) = i - 5: z(n, t) = i / 2 - 5
n = n + 1
x(n, t) = -5 + i / 2: y(n, t) = i - 5: z(n, t) = i / 2 - 5
n = n + 1
x(n, t) = -5 + i / 2: y(n, t) = i - 5: z(n, t) = -i / 2 + 5
n = n + 1
x(n, t) = 5 - i / 2: y(n, t) = i - 5: z(n, t) = -i / 2 + 5
n = n + 1
Next
''''''''''''''''''''''''''''''''''''''''''''
n = 2
t = 6
mm = 2
Call pset_line(-5, -2, -5, 2, 30, mm) 'n
Call pset_line(-5, 2, -1, -2, 30, mm)
Call pset_line(-1, -2, -1, 2, 30, mm)
Call pset_line(0, -2, 0, 2, 30, mm) 'i
Call pset_line(1, -2, 1, 2, 30, mm) 'c
Call pset_line(1, -2, 4, -2, 30, mm) 'c
Call pset_line(1, 2, 4, 2, 30, mm) 'c
n = 300
Call calc
1
Call erased
Call calc
Call pointed
DoEvents
GoTo 1
End Sub
Sub pset_line(x1, y1, x2, y2, stt, mm)
For k = 0 To stt
x(n, t) = (x1 + (x2 - x1) * k / stt) * mm
y(n, t) = (y1 + (y2 - y1) * k / stt) * mm
n = n + 1
Next
End Sub
Sub calc()
For i = 1 To n
If typ = 0 Then
XX = x(i, t) + (x(i, t1) - x(i, t)) * st / st0
YY = y(i, t) + (y(i, t1) - y(i, t)) * st / st0
zz = z(i, t) + (z(i, t1) - z(i, t)) * st / st0
Else
XX = x(i, typ)
YY = y(i, typ)
zz = z(i, typ)
End If
'GoTo 1
S = Sqr((XX) ^ 2 + (YY) ^ 2)
If XX = 0 Then
XX = S * Cos(ax - 3.14 * (YY < 0) + 1.57)
YY = S * Sin(ay - 3.14 * (YY < 0) + 1.57)
Else
Alfa = Atn(YY / XX)
YY = S * Sin(ay - 3.14 * (XX < 0) + Alfa)
XX = S * Cos(ax - 3.14 * (XX < 0) + Alfa)
End If
1
'GoTo 1
S = Sqr((XX) ^ 2 + (zz) ^ 2)
If XX = 0 Then
XX = S * Cos(ax - 3.14 * (zz < 0) + 1.57)
zz = S * Sin(az - 3.14 * (zz < 0) + 1.57)
Else
Alfa = Atn(zz / XX)
zz = S * Sin(az + Alfa - 3.14 * (XX < 0))
XX = S * Cos(ax + Alfa - 3.14 * (XX < 0))
End If
xr(i) = Int((zs) * (XX - x0) / (zz - z0) * mult + xmax / 2)
yr(i) = Int(ymax / 2 - (zs) * (YY - y0) / (zz - z0) * mult)
zr(i) = zz - z0 - zs
Next
ax = ax + 0.01
ay = ay + 0.01
az = az + 0.01
If st < st0 Then
st = st + 1
Else
If st1 < st0 Then
st1 = st1 + 1
Else
t = t1: t1 = Int(Rnd * n_t) + 1: st = 0: st1 = 0
End If
End If
End Sub
Sub pointed()
For i = 1 To n
PSet (xr(i), yr(i)), &HFFFFFF - (zr(i) - 10) * (256 + 65536 + 1) * 10
'PSet (xr(i) + 1, yr(i)), &HFFFFFF - (zr(i) - 10) * (256 + 65536 + 1) * 10
'PSet (xr(i), yr(i) + 1), &HFFFFFF - (zr(i) - 10) * (256 + 65536 + 1) * 10
'retval = SetPixel(Form1.hdc, xr(i), yr(i), &HFFFFFF)
retval = SetPixel(Form1.hdc, xr(i) + 1, yr(i), &HFFFFFF)
retval = SetPixel(Form1.hdc, xr(i), yr(i) + 1, &HFFFFFF)
Next
DoEvents
End Sub
Sub erased()
For i = 1 To n
retval = SetPixel(Form1.hdc, xr(i), yr(i), BackColor)
retval = SetPixel(Form1.hdc, xr(i) + 1, yr(i), BackColor)
retval = SetPixel(Form1.hdc, xr(i), yr(i) + 1, BackColor)
'PSet (xr(i), yr(i)), BackColor
'PSet (xr(i) + 1, yr(i)), BackColor
'PSet (xr(i), yr(i) + 1), BackColor
Next
End Sub
Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = 27 Then End
End Sub
Номер ответа: 3
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 28.02.07 18:05
Покажи код, на котором рандом выдает сходящиеся или расходящиеся звезды.
Номер ответа: 4
Автор ответа:
D o c a l
ICQ: 408802757
Вопросов: 76
Ответов: 985
Web-сайт:
Профиль | | #4
Добавлено: 28.02.07 18:14
ето ти ко мне?
Номер ответа: 5
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #5
Добавлено: 28.02.07 22:08
Нет, топикстартеру
Номер ответа: 6
Автор ответа:
sabeshkin
Вопросов: 3
Ответов: 7
Профиль | | #6
Добавлено: 01.03.07 09:21
Что значит рандом выдаёт сходящиеся точки? Они начинают сходиться после прорисовки на экране, т.е. сначала рандомом генерится массив точек а после этого с помощью хитрого алгоритма нужно координаты этих точек свести к какойлибо произвольной точке на экране.
Номер ответа: 7
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #7
Добавлено: 01.03.07 12:47
Жиденькая какая-то комп.графика... Мы и-то курили преобразования
объектов в трёхмерном пространстве и построение всяких сплайнов.
Насчет темы: я предполагаю, что нужно сначала рэндомом просчитать
конечное положение звёзд, а потом по таймеру начать каждую двигать по
прямой к центру (скорость обратно пропорциональна расстоянию от
исходного положения точки до центра - чтобы к центру они пришли
одновременно).
Номер ответа: 8
Автор ответа:
sabeshkin
Вопросов: 3
Ответов: 7
Профиль | | #8
Добавлено: 01.03.07 13:35
опиши алгоритм по которому ты будешь их потом двигать?
Проблема не в том чтобы сгенерить рандомом на форме звёздное небо, проблема в том чтобы потом эти точки начали двигаться к центру(или к заданной точке)
public partial class Form1 : Form
{
private Pen pen1 = new Pen(Color.WhiteSmoke, 1);
float CentrX;
float CentrY;
Random rnd = new Random();
Array ArrX = Array.CreateInstance(typeof(int), 100);
Array ArrY = Array.CreateInstance(typeof(int), 100);
public Form1()
{
InitializeComponent();
}
protected override void OnResize(EventArgs e)
{
Invalidate();
}
private void Form1_Click(object sender, EventArgs e)
{
Invalidate();
}
protected override void OnPaint(PaintEventArgs e)
{
CentrX = Convert.ToInt16(this.Width / 2);
CentrY = Convert.ToInt16(this.Height / 2);
Graphics g = this.CreateGraphics();
g.DrawEllipse(pen1,CentrX , CentrY, 3.0f, 3.0f);
for (int x = 0; x <= 99; x++)
{
ArrX.SetValue(rnd.Next(this.Width), x);
ArrY.SetValue(rnd.Next(this.Height), x);
}
}
private void timer1_Tick(object sender, EventArgs e)
{
for (int x1 = 0; x1 <= 99; x1++)
{
g.DrawEllipse(pen1, Convert.ToInt16(ArrX.GetValue(x)), Convert.ToInt16(ArrY.GetValue(x)), 1.0f, 1.0f);
}
}
}