Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Движение звёзд Добавлено: 28.02.07 12:04  

Автор вопроса:  sabeshkin
Народ, кто знает, поделитесь пожалуста мыслями. Проблема в том что нам по комп. графике дали задание нарисовать звёздное небо, но после прорисовки random-ом звёзд надо чтобы они стали сходиться или же расходиться из определённой точки экрана. Может кто уже рисовал такую вещь, мне хотябы алгоритм узнать, ато уж больно нудно изобретать велосипед заново, ведь наверняка алгоритм уже прорабатывали. Ну а если ещё и код подкинете (желательно на VB.NET или C#, ну накрайняк на Turbo Pascal) то вообще будет просто супер.
 Заранее большое спасибо!

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 Visual Basic .NET 2005 Пиратская версия



Вопросов: 38
Ответов: 190
 Web-сайт: ex3mos.ucoz.ru
 Профиль | | #1
Добавлено: 28.02.07 15:11
Качай с rusprojects.narod.ru в разделе .НЕТ графика Падал прошлогодний снег. Там все есть с открытым исходником и музыкой

Ответить

Номер ответа: 2
Автор ответа:
 D o c a l



ICQ: 408802757 

Вопросов: 76
Ответов: 985
 Web-сайт: www.doc-source.pp.net.ua/
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 28.02.07 18:05
Покажи код, на котором рандом выдает сходящиеся или расходящиеся звезды.

Ответить

Номер ответа: 4
Автор ответа:
 D o c a l



ICQ: 408802757 

Вопросов: 76
Ответов: 985
 Web-сайт: www.doc-source.pp.net.ua/
 Профиль | | #4
Добавлено: 28.02.07 18:14
ето ти ко мне?

Ответить

Номер ответа: 5
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #5
Добавлено: 28.02.07 22:08
Нет, топикстартеру

Ответить

Номер ответа: 6
Автор ответа:
 sabeshkin



Вопросов: 3
Ответов: 7
 Профиль | | #6 Добавлено: 01.03.07 09:21
после прорисовки random-ом звёзд надо чтобы они стали сходиться или же расходиться из определённой точки экрана

Что значит рандом выдаёт сходящиеся точки? Они начинают сходиться после прорисовки на экране, т.е. сначала рандомом генерится массив точек а после этого с помощью хитрого алгоритма нужно координаты этих точек свести к какойлибо произвольной точке на экране.

Ответить

Номер ответа: 7
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #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);
}

}
}

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам