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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2010, 16:24   #1
SOKOLDANGER
 
Регистрация: 21.05.2010
Сообщений: 8
Восклицание Кривая Гильберта

Помогите очень нужна помощь.

Написать программу, которая вычерчивает на экране кривую Гильберта, показанную на рисунке. Обратите внимание, что кривая второго порядка получается путем соединения четырех кривых первого порядка, две из которых повернуты на 90 градусов: одна по, другая — против часовой стрелки. Аналогичным образом получается кривая третьего порядка, но при этом в качестве "кирпичиков" используются кривые второго порядка. Порядок вычерчиваемой кривой должен вводиться во время работы программы.
SOKOLDANGER вне форума Ответить с цитированием
Старый 22.05.2010, 16:31   #2
SOKOLDANGER
 
Регистрация: 21.05.2010
Сообщений: 8
По умолчанию

Вот мой код:

Код:
#include <windows.h>
#define u 10

void linetodxy(int dx, int dy);
int x, y;

void a(int i);
void b(int i);
void c(int i);
void d(int i);
HDC hdc; 
PAINTSTRUCT ps; 
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
char szClassName[ ] = "Krivaia Gil'berta";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;
    MSG messages;
    WNDCLASSEX wincl;
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof (WNDCLASSEX);
    
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL; 
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = CreateSolidBrush(RGB(140,140,140));

    if (!RegisterClassEx (&wincl))
        return 0;
    hwnd = CreateWindowEx (
           0,
           szClassName,
           "Krivaia Gil'berta"
           WS_OVERLAPPEDWINDOW,
           CW_USEDEFAULT,
           CW_USEDEFAULT,
           800,
           600,                 
           HWND_DESKTOP,        
           NULL,                
           hThisInstance,       
           NULL                 
           );
    ShowWindow (hwnd, nFunsterStil);
    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    return messages.wParam;
}
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        
        
    switch (message)                
    {
           
           case WM_PAINT :
                
                hdc=BeginPaint(hwnd, &ps);
                TextOut(hdc, 50,50, "Krivaia Serpinskogo", 26);
                POINT z;
                x=100; y=100;

                MoveToEx(hdc, x, y, NULL);

                a(1); linetodxy(-u, u);
                b(1); linetodxy(-u, u);
                c(1); linetodxy(u, -u);
                d(1); linetodxy(u, -u);
                ValidateRect(hwnd, NULL);
                EndPaint(hwnd, &ps);
                break;
                
           
           
        case WM_DESTROY:
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

void a(int i) {

 if(i>0) 
 {
  d(i-1);
  linetodxy(u, 0);
  a(i-1);
  linetodxy(0, u);
  a(i-1);
  linetodxy(-u, 0);
  c(i-1);
 }
}

void b(int i) {

 if(i>0) {
  c(i-1);
  linetodxy(-u, 0);
  b(i-1);
  linetodxy(0, -u);
  b(i-1);
  linetodxy(u, 0);
  d(i-1);
 }
}

void c(int i) {

 if(i>0) {
  b(i-1);
  linetodxy(0, -u);
  c(i-1);
  linetodxy(-u, 0);
  c(i-1);
  linetodxy(0, u);
  a(i-1);
 }
}

void d(int i) {

 if(i>0) {
  a(i-1);
  linetodxy(0, u);
  d(i-1);
  linetodxy(u, 0);
  d(i-1);
  linetodxy(0, -u);
  b(i-1);
 }
}


void linetodxy(int dx, int dy)
{
     x += dx;
     y += dy;
     LineTo(hdc, x, y);
}
Я писал в DEV C++ но можно помочь и в Microsoft Visual Studio 2008. Пригодится любая помощь.
SOKOLDANGER вне форума Ответить с цитированием
Старый 22.05.2010, 23:39   #3
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

А в чем, собственно проблема? Не вижу вопроса по сути.
По сабжу - писал когда-то в консоли
Код:
#include <graphics.h>
#include <conio.h>
#include <math.h>
#define pi M_PI

void Draw (double x, double y, double r, double a)
{
	int i;
	double xx[6], yy[6];

	for (i=0; i<6; i++)
	{
		xx[i] = r*cos(a+i*pi*2/5);
		yy[i] = r*sin(a+i*pi*2/5);
	}
	for (i=0; i<5; i++)
		line (x+xx[i], y+yy[i], x+xx[i+1], y+yy[i+1]);
}

void ProvRis (double x, double y, double r, double a, int d)
{
	int i;
	double h;

	h = 2*r*cos(pi/5);

	for (i=0; i<5; i++)
	{
		Draw (x - h*cos(a+i*pi*2/5), y - h*sin(a+i*pi*2/5), r, a+pi);
		if ( d > 0 )
			ProvRis (x - h*cos(a+i*pi*2/5), y - h*sin(a+i*pi*2/5), r/(2*cos(pi/5)+1), a, d-1);
	}
	//Draw (x, y, r, a);
	if ( d > 0 )
		ProvRis (x, y, r/(2*cos(pi/5)+1), a+pi, d-1);
}

int main ()
{
	int gm, gd=DETECT;

	initgraph (&gd, &gm, "egavga.bgi");
	ProvRis (320, 260, 95, pi/2, 3);
	getch ();
	closegraph ();

	return 0;
}
MaTBeu вне форума Ответить с цитированием
Старый 23.05.2010, 01:44   #4
SOKOLDANGER
 
Регистрация: 21.05.2010
Сообщений: 8
По умолчанию

Я такой вариант решения находил в книге но он не работает так как надо. Пишет ошибку в библиотеке "#include <graphics.h>". Может я что то не то создаю. Но нам сказали написать в DEV С++, а не в Visual Studio. И там только WIN32 API может это нарисовать только он рисует не то что надо. И я не знаю что делать ??????

А за код все равно СПАСИБО.
SOKOLDANGER вне форума Ответить с цитированием
Старый 23.05.2010, 02:14   #5
SOKOLDANGER
 
Регистрация: 21.05.2010
Сообщений: 8
По умолчанию

MaTBeu спасибо за помощь. Но я сам справился ...
SOKOLDANGER вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение кривых Серпинского и Гильберта Delphi KEnt Помощь студентам 3 07.10.2017 11:42
Оптимизация кода (Преобразование Гильберта на MMX) MDis Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 30.04.2010 07:42
Плавная кривая (Delphi) Mila2009 Помощь студентам 3 12.06.2009 15:17
Кривая Безье ELL Помощь студентам 4 20.05.2008 22:56