Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2012, 23:14   #1
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию Нужно заставить точки вращаться = )

Программа на C#, рисуются точки, после чего они вращаются(по крайней мере должны бы), но у меня почему-то эти точки статичны, помогите пожалуйста! Буду очень-очень благодарен.
Вот код:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace _3D
{
    public partial class Form1 : Form
    {
        bool Direct = false;
        Random rand = new Random();
        public static int PointsCount = 1000;
        MyPoint.Points[] Points3D; 
        static float Alpha = 0.01F;

        float CosA = (float)Math.Cos(Alpha), SinA = (float)Math.Sin(Alpha);
        public static int wWidth = 0, wHeight = 0;
        public static int oX = 0, oY = 0;
        int D = 0, OfsZ = 0;

        public Form1()
        {
            InitializeComponent();
            oX = Wn.Width / 2;
            oY = Wn.Height / 2;
            wWidth = Wn.Width;
            wHeight = Wn.Height;
            D = (Wn.Width + Wn.Height) / 2;
            OfsZ = D;
            Points3D = new MyPoint.Points[PointsCount];
            for (int i = 0; i < PointsCount; i++)
            {
                Points3D[i].X = rand.Next(Form1.wWidth + 1) - Form1.oX;
                Points3D[i].Y = rand.Next(Form1.wHeight + 1) - Form1.oY;
                Points3D[i].Z = rand.Next(Form1.wWidth + 1) - Form1.oX;
            }
        }

        private void Wn_Paint(object sender, PaintEventArgs e)
        {
            Invalidate();
            Pen pen = new Pen(Color.White);
            MovePoints(e, pen);  
            }

        public void MovePoints(PaintEventArgs e, Pen pen)
        {
            int X = 0, Y = 0;
            float tX = 0, tY = 0, tZ = 0, k = 0;
            for (int i = 0; i < PointsCount; i++)
            {
                switch (Direct)
                {
                    case true:
                        {
                            tY = (float)(Points3D[i].Y * CosA - Points3D[i].Z * SinA);
                            tZ = (float)(Points3D[i].Y * SinA + Points3D[i].Z * CosA);
                            Points3D[i].Y = tY;
                            Points3D[i].Z = tZ;
                            break;
                        }
                    case false:
                        {
                            tX = (float)(Points3D[i].X * CosA - Points3D[i].Z * SinA);
                            tZ = (float)(Points3D[i].X * SinA + Points3D[i].Z * CosA);
                            Points3D[i].X = tX;
                            Points3D[i].Z = tZ;
                            break;
                        }
                }
                if ((Points3D[i].Z + D) == 0) Points3D[i].Z = 0.1;

                k = (float)(D / (Points3D[i].Z + OfsZ));

                X = oX + (int)(Points3D[i].X * k);
                Y = oY + (int)(Points3D[i].Y * k);

                e.Graphics.DrawEllipse(pen, X, Y, 2, 2);
            }
        }
    }
}

Последний раз редактировалось Alek-de-Mik; 05.11.2012 в 23:21.
Alek-de-Mik вне форума Ответить с цитированием
Старый 05.11.2012, 23:20   #2
koljsch
Форумчанин
 
Регистрация: 26.01.2009
Сообщений: 360
По умолчанию

Так нарисовал точку и запомни координаты, далее рисуй на том же месте цветом фона(так их удалишь) и передвигай на определенное расстояние
koljsch вне форума Ответить с цитированием
Старый 05.11.2012, 23:25   #3
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

А вот код этой же программы на C++ которая работает, ну помогите мне = ) Я просто в С++ не очень разбираюсь, только на уровне консоли.
Код:
#include "stdafx.h"
#include "Points3D.h"
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "gdi32.lib")
HINSTANCE hInst;							
TCHAR *szTitle = L"Points3D";					
TCHAR *szWindowClass = L"Points3D";	
struct TPoint3D  // Структура описывающая точку в пространстве
{
  float X;
  float Y;
  float Z;
};
ATOM			 	MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
PAINTSTRUCT ps;
HDC hdc;
HDC compdc = 0;
HBITMAP buffer = 0;
BOOL Direct = FALSE;
HWND MainWnd;
const int  rPoint     = 3;      //  Радиус точек
const float Alpha     = 0.01;   //  Угол поворота точек
const int PointsCount = 1000;   //  Кол-во генерируемых точек
float CosA = cos(Alpha);
float SinA = sin(Alpha);
int D = 0;
int oX = 0;
int oY = 0;
int ClientWidth;
int ClientHeight;
TPoint3D Point3D[PointsCount];
void InitProgram()
{
  ClientWidth  = 640;
  ClientHeight = 480;
  D = (ClientWidth + ClientHeight) / 2;
  // Вычисляем центр экрана
  oX = ClientWidth  / 2;
  oY = ClientHeight / 2;
  // Генерация трехмерных точек
  for (int i = 0; i < PointsCount; i++)
  {
	Point3D[i].X = (rand() % ClientWidth) - oX;
	Point3D[i].Y = (rand() % ClientHeight) - oY;
	Point3D[i].Z = (rand() % ClientWidth) - oX;
  }
}
void MovePoints()
{
  int X, Y;
  float k, tX, tY, tZ;
  for (int i = 0; i < PointsCount; i++)
  {
	  switch (Direct)
	  {
		case TRUE:  // Крутим точки по оси YZ
	    {
			tY = Point3D[i].Y * CosA - Point3D[i].Z * SinA;
			tZ = Point3D[i].Y * SinA + Point3D[i].Z * CosA;
            Point3D[i].Y = tY;
            Point3D[i].Z = tZ;
		}
		case FALSE:  // Крутим точки по оси XZ
	    {
			tX = Point3D[i].X * CosA - Point3D[i].Z * SinA;
            tZ = Point3D[i].X * SinA + Point3D[i].Z * CosA;
            Point3D[i].X = tX;
            Point3D[i].Z = tZ;
		}
	  } /* switch */
	if ((Point3D[i].Z + D) == 0) Point3D[i].Z = 0.1;
    k = D / (Point3D[i].Z + D);
    X = oX + floor(Point3D[i].X * k);
    Y = oY + floor(Point3D[i].Y * k);
	Ellipse(compdc, X - rPoint, Y - rPoint, X + rPoint, Y + rPoint); 
  }
}
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);
	MSG msg;
	HACCEL hAccelTable;
	MyRegisterClass(hInstance);
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}
	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_POINTS3D));
    SetTimer(MainWnd, 0, 1, 0);
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	KillTimer(MainWnd, 0);
	return (int) msg.wParam;
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;
	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= 0;
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= 0;
	wcex.lpszMenuName	= 0;
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= 0;
	return RegisterClassEx(&wcex);
}
//---Продолжение следует..---//
Alek-de-Mik вне форума Ответить с цитированием
Старый 05.11.2012, 23:25   #4
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

Код:
//--Продолжение--//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; 
   InitProgram();
   MainWnd = CreateWindowEx(
	   0, 
	   szWindowClass, 
	   szTitle, 
	   WS_OVERLAPPEDWINDOW,
	   100, 
	   100, 
	   ClientWidth, 
	   ClientHeight, 
	   NULL, 
	   NULL, 
	   hInstance, 
	   NULL);
   if (!MainWnd)
   {
      return FALSE;
   }
   ShowWindow(MainWnd, nCmdShow);
   UpdateWindow(MainWnd);
   return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_SIZE:
		{
			hdc = GetDC(hWnd);
			ClientWidth = LOWORD(lParam);
			ClientHeight = HIWORD(lParam);
			if (compdc != 0) DeleteObject(compdc);
			if (buffer != 0) DeleteObject(buffer);
			compdc = CreateCompatibleDC(hdc);
			buffer = CreateCompatibleBitmap(hdc, ClientWidth, ClientHeight);
			SelectObject(compdc, buffer);
			ReleaseDC(hWnd, hdc);
			oX = ClientWidth  / 2;
			oY = ClientHeight / 2;
		} break;
	case WM_TIMER: 
		{
			InvalidateRect(hWnd, 0, FALSE);
		} break;
	case WM_KEYDOWN: 
		{
			Direct = !Direct;
		} break;
	case WM_PAINT:
		{
			hdc = BeginPaint(hWnd, &ps);
			// Стираем буфер рисования 
			HPEN hpen = (HPEN) GetStockObject(BLACK_PEN);
			HBRUSH hbrush = (HBRUSH) GetStockObject(BLACK_BRUSH);
			SelectObject(compdc, hpen);
			SelectObject(compdc, hbrush);
			Rectangle(compdc, 0, 0, ClientWidth, ClientHeight);
			// Рисуем точки белым цветом 
			hpen = (HPEN) GetStockObject(WHITE_PEN);
			hbrush = (HBRUSH) GetStockObject(WHITE_BRUSH);
			SelectObject(compdc, hpen);
			SelectObject(compdc, hbrush);
			MovePoints();
			// Скидываем буфер рисования на экран 
			BitBlt(hdc, 0, 0, ClientWidth, ClientHeight, compdc, 0, 0, SRCCOPY);
			EndPaint(hWnd, &ps);
		}	break;
	case WM_DESTROY:
		{
		DeleteObject(compdc);
		DeleteObject(buffer);
		PostQuitMessage(0);
		} break;
	case WM_ERASEBKGND: break;
	default: return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;}
Alek-de-Mik вне форума Ответить с цитированием
Старый 05.11.2012, 23:27   #5
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

koljsch, Мозгом то я понимаю как это сделать, у меня проблема в том, что я хз как их двигать, вроде формула та же, а они всё равно стоят как вкопанные.
Alek-de-Mik вне форума Ответить с цитированием
Старый 05.11.2012, 23:30   #6
koljsch
Форумчанин
 
Регистрация: 26.01.2009
Сообщений: 360
По умолчанию

Так вот же движение:
Код:
void MovePoints()
{
  int X, Y;
  float k, tX, tY, tZ;
  for (int i = 0; i < PointsCount; i++)
  {
	  switch (Direct)
	  {
		case TRUE:  // Крутим точки по оси YZ
	    {
			tY = Point3D[i].Y * CosA - Point3D[i].Z * SinA;
			tZ = Point3D[i].Y * SinA + Point3D[i].Z * CosA;
            Point3D[i].Y = tY;
            Point3D[i].Z = tZ;
		}
		case FALSE:  // Крутим точки по оси XZ
	    {
			tX = Point3D[i].X * CosA - Point3D[i].Z * SinA;
            tZ = Point3D[i].X * SinA + Point3D[i].Z * CosA;
            Point3D[i].X = tX;
            Point3D[i].Z = tZ;
		}
	  } /* switch */
	if ((Point3D[i].Z + D) == 0) Point3D[i].Z = 0.1;
    k = D / (Point3D[i].Z + D);
    X = oX + floor(Point3D[i].X * k);
    Y = oY + floor(Point3D[i].Y * k);
	Ellipse(compdc, X - rPoint, Y - rPoint, X + rPoint, Y + rPoint); 
  }
}
На C# сам не работаю, но смысл в функции там такой: цикл продолжается для каждой точки PointsCount; далее идет выбор от переменной Switch(как я понимаю это какая ось вращаться будет), если true, то по YZ, если false, то XZ. А все остальное очень легко под шарп сделать. А когда нужно вращать, то вызываете эту функцию и все
koljsch вне форума Ответить с цитированием
Старый 05.11.2012, 23:32   #7
koljsch
Форумчанин
 
Регистрация: 26.01.2009
Сообщений: 360
По умолчанию

А тут даже только одна функция, которая не стандартная-это Ellipse, а все остальное обычные арифметические действия. Какую точку вращать он берет из массива Point3D
koljsch вне форума Ответить с цитированием
Старый 05.11.2012, 23:39   #8
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

koljsch, спасибо, вы помогли мне понять в чем проблема = ) Надо будет побольше почитать про событие Paint в C# = )
Alek-de-Mik вне форума Ответить с цитированием
Старый 05.11.2012, 23:42   #9
koljsch
Форумчанин
 
Регистрация: 26.01.2009
Сообщений: 360
По умолчанию

Alek-de-Mik, всегда пожалуйста!) Рад, что смог помочь))
koljsch вне форума Ответить с цитированием
Старый 06.11.2012, 00:05   #10
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

Возник другой вопрос = ). А как собственно в C# отрисовывать по таймеру? Что-то я ничего не смог найти.=)
-------
Отбой тревоги, я разобралсо= )

Последний раз редактировалось Alek-de-Mik; 06.11.2012 в 00:12.
Alek-de-Mik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нарисовать движущийся автомобиль: колеса при этом должны вращаться, и должен идти дым из выхлопной трубы. killere0 Паскаль, Turbo Pascal, PascalABC.NET 2 18.06.2012 15:36
Как заставить шар вращаться вокруг элипса? Amid1990 Помощь студентам 8 09.07.2011 09:51
Нужно найти координаты точки пересечения двух отрезков в пространстве... Dima6120 Мультимедиа в Delphi 2 30.07.2010 13:36
Нужно найти связную область одного цвета начиная с произвольной точки. kostyan142 Помощь студентам 9 12.01.2010 00:12
Отбражение чисел - точки, это точки, а не запятые, обозначающие дробную часть Дикий Помощь студентам 7 12.05.2008 17:57