Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисуем 3-ый график, график 
:(
    Опции темы
vahitov
Дата 8.4.2004, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 26.3.2004

Репутация: нет
Всего: нет



Мне надо нарисовать 3-ый график(поверхность фигуры) методами обычной GDI, т.е. обычными линиями и т.д. Как это делаеться? подскажите что почитать или может у кого есть исходники(желательно на с++)? smile.gif

Что-то слышал про метод треугольника, но не знаю что это? Подскажите, посоветуйте.
PM MAIL   Вверх
achmed
Дата 8.4.2004, 20:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











если ничего про это не знаешь то тяжело будет, почитать какую-нибудь книгу по машинной графике
  Вверх
Peter
Дата 9.4.2004, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: -1
Всего: 1



Да вообще-то я этот алгоритм сам придумывал. Это несложно, если аналитической и проективной геометрией владеешь. Под рукой нет. Может, через несколько дней программку закину (если не забуду).

Совет: открыть книжку по аналитической геометрии, изучить ее, а потом покрутить мозгульками.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
vahitov
Дата 9.4.2004, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 26.3.2004

Репутация: нет
Всего: нет



Скинь - пожалуйста. а то время особо нет что-то изучать. Надо бысто какой-то алгоритм освоить и подогнать под мою задачу.
PM MAIL   Вверх
maxim1000
Дата 9.4.2004, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



сначала надо определиться, в каком виде хочется его рисовать:
1. можно наложить на него сетку: визулазиция неплохая и сделать просто
2. можно раскрасить так, как будто тело освещают, тогда действительно можно аппроксимировать поверхность набором треугольников и каждый из них раскрашивать отдельно

Это сообщение отредактировал(а) maxim1000 - 9.4.2004, 11:27


--------------------
qqq
PM WWW   Вверх
podval
Дата 9.4.2004, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 1
Всего: 62



Вот код, правда, немного древний, но суть понять можно.
Код
//////////////////////////////////////////////////////////////////////////////
//
//  Drawing 3D object
//  (c) Johna Smith, 1996
//
//  Method description:
//    Function draw3Dobject recieves the following parameters:
//     object - reference to array of points of the drawn object
//     N - number of points in this array
//     rho     \
//     phi     |- spherical coordinates of point of view
//     theta   /
//     dist_to_screen - distance from viewpoint to screen
//     xshift, yshift - picture will be shifted by this values
//
//////////////////////////////////////////////////////////////////////////////

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <dos.h>

#define Pi 3.1415926536

enum Action{move,draw};

struct Point3D
{
 int x;
 int y;
 int z;
 Action action;
};

// this function initializes graphics mode
// it will work only if you're using Borland C++ compiler & BGI drivers
// if you're using another compiler you should overwrite body of this function

void init_gr(void)
{
       /* request autodetection */
       int gdriver = DETECT, gmode, errorcode;

       /* initialize graphics mode */
       initgraph(&gdriver, &gmode, "");

       /* read result of initialization */
       errorcode = graphresult();

       if (errorcode != grOk)    /* an error occurred */
     {
               printf("Graphics error: %s\n", grapherrormsg(errorcode));
               printf("Press any key to halt:");
                                        getch();
               exit(1);               /* return with error code */
       }
}

// this function shuts graphics mode down
// it will work only if you're using Borland C++ compiler & BGI drivers
// if you're using another compiler you should overwrite body of this function

void end_gr(void)
{
 closegraph();
}

// this function moves CP to (x,y) position
// it will work only if you're using Borland C++ compiler & BGI drivers
// if you're using another compiler you should overwrite body of this function

void MoveTo(int x, int y)
{
 moveto(x,y);
}

// this function draws a line to (x,y) position
// it will work only if you're using Borland C++ compiler & BGI drivers
// if you're using another compiler you should overwrite body of this function

void LineTo(int x, int y)
{
 lineto(x,y);
}

void draw3Dobject(Point3D *object, int N, float rho, float theta,
                 float phi, float dist_to_screen, int xshift, int yshift)
{
 int x,y;
 float xe,ye,ze,costh,sinph,cosph,sinth,v11,v12,v13,v21,v22,v32,v33,v23,v43;

 // calculating coefficients
 costh=cos(theta);
 sinth=sin(theta);
 cosph=cos(phi);
 sinph=sin(phi);
 v11=-sinth; v12=-cosph*costh; v13=-sinph*costh;
 v21=costh;  v22=-cosph*sinth; v23=-sinph*sinth;
                                 v32=sinph;        v33=-cosph;
                               v43=rho;
 for (int i=0;i<N;i++)
 {
  // calculating eye coordinates
  xe=v11*(object+i)->x+v21*(object+i)->y;
  ye=v12*(object+i)->x+v22*(object+i)->y+v32*(object+i)->z;
  ze=v13*(object+i)->x+v23*(object+i)->y+v33*(object+i)->z+v43;
  // calculating screen coordinates
  x=dist_to_screen*xe/ze+xshift;
  y=dist_to_screen*ye/ze+yshift;
  // drawing
  if((object+i)->action==move)
     MoveTo(x,y);
  else
     LineTo(x,y);
 }
}

int main(void)
{
 Point3D thetr[]={{100,100,100,move},
       {100,200,100,draw},
       {200,100,100,draw},
       {100,100,100,draw},
       {100,100,200,draw},
       {200,100,100,draw},
       {100,100,200,move},
       {100,200,100,draw}};
 int N=sizeof(thetr)/sizeof(Point3D);
 float rho=700,theta=Pi/4,phi=Pi/4,dist_to_screen=300;
 int xshift=300, yshift=150;

 // initializing graphics mode
 init_gr();

 /* examples */
 while (!kbhit())
 {
 theta+=0.05;
 // rotating viewpoint
 if (phi>2*Pi) phi-=2*Pi;
 setcolor(11);
 draw3Dobject(thetr,N,rho,theta,phi,dist_to_screen,xshift,yshift);
 setcolor(0);
   delay(15);
 draw3Dobject(thetr,N,rho,theta,phi,dist_to_screen,xshift,yshift);
 }

 /* clean up */
 getch();
 end_gr();

 return 0;
}

PM WWW ICQ   Вверх
vahitov
Дата 10.4.2004, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 26.3.2004

Репутация: нет
Всего: нет



Конечно, алгоритм хороший и работающий. Но как расскрасить поверхность(слышал, что надо аппроксимировать треугольниками). Но как это делаеться?

Помогите!!!!!!!!!!!!!!!!!!!!
PM MAIL   Вверх
maxim1000
Дата 11.4.2004, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



что конкретно непонятно: как аппроксимировать поверхность треугольниками или как расскраситть отдельно взятый треугольник?


--------------------
qqq
PM WWW   Вверх
vahitov
Дата 11.4.2004, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 26.3.2004

Репутация: нет
Всего: нет



maxim1000 ,

Как апроксимировать не понятно. А расскрашивать я думаю надо по какой-то координате.


Если знаешь как делаеться - помоги. Плиззз. Иль поделись исходниками, если они есть.

PM MAIL   Вверх
maxim1000
Дата 11.4.2004, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



исходников у меня нет...
1. как аппроксимировать:
пусть поверхность задается функцией от двух аргументов: z=f(x,y)
делим плоскость на квадраты с фиксированной стороной, каждый из них - пополам
получаем плоскость, разделенную на треугольники
но нам нужны треугольники в трехмерном пространстве
каждой точке каждого треугольника приписываем третью координату по очень простому правилу: z=f(x,y)
получаем кучу треугольников
2. как отображать:
для отображения треугольника нужно знать: его координаты (на экране), его цвет
экранные координаты обычно получаются проекцией реальных координат на какую-то плоскость
цвет можно определять по формуле color=max*cos(alpha)
color - цвет, которым треугольник будет нарисован на экране
max - цвет треугольника при максимальном освещении (если фигура одноцветная - просто константа)
alpha - угол между нормалью к треугольнику и вектором направления света (меняя этот вектор можно будет освещать фигуру с разных сторон)


--------------------
qqq
PM WWW   Вверх
vahitov
Дата 11.4.2004, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 26.3.2004

Репутация: нет
Всего: нет



конечно ловчее дыло бы исходнии посмотреть, т.к. мне эта тема не сильно интересна - просто надо сделать. Ну за это тоже спасибо. Попробую над этим подумать.
PM MAIL   Вверх
Peter
Дата 12.4.2004, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: -1
Всего: 1



2vahitov: отправляю по e-mail, поскольку у меня все в rtf-ах.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
vahitov
Дата 12.4.2004, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 26.3.2004

Репутация: нет
Всего: нет



To Peter, СПАСИБА.
PM MAIL   Вверх
Peter
Дата 16.4.2004, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: -1
Всего: 1



Цитата(vahitov @ 12.4.2004, 20:22)
To Peter, СПАСИБА.

Пожалуйста, приходите еще.
Кстати, тут же вроде бы недавно можно было файлы оставлять на форуме в качестве ответа. Куда это пропало? Или я ошибаюсь?


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
vahitov
Дата 16.4.2004, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 26.3.2004

Репутация: нет
Всего: нет



To Peter.
Фиг знает.
Надо у модераторов спрашивать
PM MAIL   Вверх
Peter
Дата 6.5.2004, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: -1
Всего: 1



Шлю теперь (опять-таки по емеле) работающую программу.
Кому еще надо - просите.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.