Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Visual C++
Регистрация

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 08.08.2019, 20:48   #1
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,210
Репутация: 93
По умолчанию Оптимизация рисования графика

Начну с вопроса. Почему медленно работает? Что нужно оптимизировать?
Ну не может быть так, чтобы мой мощный Pentium 1800 так долго строил график. Я ожидал нечто большего. Практически так же долго, как мой "средний" Celeron 1700.

А теперь текст программы. Эта программа строит 3D-график функции z = y / x.

Инструкция
Запустив программу, вы видите на экране график функции z = x / y.
Вы можете изменить масштаб графика, нажимая +/-.
Вы можете изменить угол зрения. Для этого сначала нажмите <NumLock>, после чего включится дополнительная цифровая клавиатура. Нажимая стрелки, вы измените угол зрения. Нажав <5>, вы вернётесь к исходной точке и масштабу.

Сделано под Windows 98 на Visual C++ 6.0.
Код:
// p3View.cpp : implementation of the CP3View class
//


#include "stdafx.h"
#include <math.h>
#include "p3.h"

#include "p3Doc.h"
#include "p3View.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


//   Данные задачи

double xa, ya, za;		//   вектор ориентации в пространстве осей системы координат ("определяющий вектор") - смотрит на наблюдателя (ось Oz)
double xb, yb, zb;		//   ось Ox в 3D
double xc, yc, zc;		//   ось Oy в 3D

int scale;			//   масштаб графика
int flag;			//   флаг рисования отрезка в 3D: 0 - не рисовать; 1 - первая точка отрезка; 2 - вторая точка отрезка
int number;		//   номер графика
int aa;

void initialize ();		//   инициализация исходных данных перед построением графика
void calculate ();		//   расчёт векторов осей Oz, Ox, Oy
void draw (CDC *);		//   рисование графика
void line (double, double, double, double, double, double, CDC *);		//   рисование линии в 3D

double f1 (double, double);		//   функция z = f (x, y), график которой строится


/////////////////////////////////////////////////////////////////////////////
// CP3View

IMPLEMENT_DYNCREATE(CP3View, CView)

BEGIN_MESSAGE_MAP(CP3View, CView)
	//{{AFX_MSG_MAP(CP3View)
	ON_WM_CHAR()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CP3View construction/destruction

CP3View::CP3View()
{
	number = 1;		//   номер графика функции
	aa = 0;
	initialize ();
}

CP3View::~CP3View()
{
}

BOOL CP3View::PreCreateWindow(CREATESTRUCT& cs)
{
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CP3View drawing

void CP3View::OnDraw (CDC *pDC)
{
	CP3Doc *pdoc = GetDocument ();
	ASSERT_VALID (pdoc);
	CString a;

	calculate ();
	draw (pDC);		//   рисование 3D-графика

	//   рисование осей координат в 3D
	line (500, 0, 0, -500, 0, 0, pDC);
	line (0, 500, 0, 0, -500, 0, pDC);
	line (0, 0, 0, 0, 0, 500, pDC);
	a.Format ("key = %i.", aa);
	pDC -> TextOut (10, 10, a);
}

/////////////////////////////////////////////////////////////////////////////
// CP3View printing

BOOL CP3View::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CP3View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
}

void CP3View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
}

/////////////////////////////////////////////////////////////////////////////
// CP3View diagnostics

#ifdef _DEBUG
void CP3View::AssertValid() const
{
	CView::AssertValid();
}

void CP3View::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CP3Doc* CP3View::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CP3Doc)));
	return (CP3Doc*)m_pDocument;
}
#endif //_DEBUG

//
// CP3View message handlers

void CP3View::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	double a, b;	//   временные переменные

	switch (nChar)
	{
	case '5':	//   возврат к значениям по умолчанию
		initialize ();
		break;

	case 'a':	//   график первой функции
		number = 1;
		break;

	case '4':	//   смещение графика влево <Left arrow>
		a = xa * cos (.1) + ya * sin (.1);
		b = -xa * sin (.1) + ya * cos (.1);
		xa = a;
		ya = b;
		break;

	case '6':	//   смещение графика вправо <Right arrow>
		a = xa * cos (.1) - ya * sin (.1);
		b = xa * sin (.1) + ya * cos (.1);
		xa = a;
		ya = b;
		break;

	case '8':	//   смещение графика вверх <Up arrow>
		xa -= xb * sin (.1);
		ya -= yb * sin (.1);
		za -= zb * sin (.1);
		break;

	case '2':	//   смещение графика вниз <Down arrow>
		xa += xb * sin (.1);
		ya += yb * sin (.1);
		za += zb * sin (.1);
		break;

	case '+':	//   увеличение масштаба
		scale = (int) (scale * 1.3);
		break;

	case '-':	//   уменьшение масштаба
		scale = (int) (scale / 1.3);
		if (scale == 0) scale = 1;
	}

	CView::OnChar (nChar, nRepCnt, nFlags);
	aa = nChar;
	Invalidate ();
}


void initialize ()
{
	xa = ya = za = 1;	//   определяющий вектор
	xc = yc = zc = 0;	//   вектор направления оси Oy
	scale = 50;		//   масштаб
}


void calculate ()
{
	double a, b, c;		//   вспомогательные переменные

	//   1. Нормирование определяющего вектора
	a = sqrt (xa * xa + ya * ya + za * za);
	xa /= a;
	ya /= a;
	za /= a;

	//   2. Проекция вектора (0, 0, 1) на определяющий вектор
	a = xa * za;
	b = ya * za;
	c = za * za;

	xb = -a;
	yb = -b;
	zb = 1 - c;

	//   3. Нормирование вектора оси Ox
	a = sqrt (xb * xb + yb * yb + zb * zb);
	if (a == 0) return;
	xb /= a;
	yb /= a;
	zb /= a;

	//   4. Вычисление вектора оси Oy; векторное произведение двух других осей.
	a = ya * zb - za * yb;
	b = za * xb - xa * zb;
	c = xa * yb - ya * xb;

	//   5. Инверсия левой тройки векторов
	if (a * xc + b * yc + c * zc < 0)
	{
		xb = -xb; yb = -yb; zb = -zb;
		xc = -a; yc = -b; zc = -c;
	}
	else {xc = a; yc = b; zc = c;}
}


void draw (CDC *pDC)
{
	int a, b;
	double d, e;

	e = 0;
	for (a = -500; a <= 500; a += 30)	//   проходим значения x
	{
		flag = 0;
		for (b = -500; b <= 500; b++)		//   проходим значения y
		{
			switch (number)		//   выбираем, график какой функции строится
			{
			case 1:
				d = f1 ((double) a / scale, (double) b / scale) * scale;
				break;
			default:
				d = 0;
			}

			//   Если имеются две рассчитанные точки, строим линию в 3D
			if (flag == 2) line (a, b - 1, e, a, b, d, pDC);
			e = d;
		}
	}

	for (b = -500; b <= 500; b += 30)	//   проходим значения y
	{
		flag = 0;
		for (a = -500; a <= 500; a++)		//   проходим значения x
		{
			switch (number)		//   выбираем, график какой функции строится
			{
			case 1:
				d = f1 ((double) a / scale, (double) b / scale) * scale;
				break;
			default:
				d = 0;
			}

			//   Если имеются две рассчитанные точки, строим линию в 3D
			if (flag == 2) line (a - 1, b, e, a, b, d, pDC);
			e = d;
		}
	}
}


void line (double a, double b, double c, double d, double e, double f, CDC *pDC)
{
	double g, h;	//   первая точка на плоскости
	double i, j;	//   вторая точка на плоскости

	g = a * xb + b * yb + c * zb;
	h = a * xc + b * yc + c * zc;		//   проекция первого вектора на ось Oy
	i = d * xb + e * yb + f * zb;
	j = d * xc + e * yc + f * zc;		//   проекция второго вектора на ось Oy

	if (g > 1500)  g = 1500;
	if (g < -1500)  g = -1500;
	if (i > 1500)  i = 1500;
	if (i < -1500)  i = -1500;

	pDC -> MoveTo (400 - (int) h, 400 - (int) g);
	pDC -> LineTo (400 - (int) j, 400 - (int) i);
}


double f1 (double x, double y)
{
	double z;

	if (y == 0) {flag = 0; return 0;}		//   область определения функции
	z = x / y;		//   функция, график которой надо построить

	if (flag < 2) flag++;
	if (z > 100)  {flag = 0; return 0;}
	if (z < -100)  {flag = 0; return 0;}

	return z;
}
__________________
мой канал на Ютубе: youtube.com/channel/UCdtIJx_8tDGrc9n-Y0JsllA
jura_k вне форума   Ответить с цитированием
Старый 10.08.2019, 09:18   #2
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,210
Репутация: 93
По умолчанию

Выкладываю архив. В архиве: программа (exe-файл); код программы; документ для распечатки (на стенку повесить); инструкция.
Вложения
Тип файла: zip p3.zip (19.1 Кб, 12 просмотров)
__________________
мой канал на Ютубе: youtube.com/channel/UCdtIJx_8tDGrc9n-Y0JsllA
jura_k вне форума   Ответить с цитированием
Старый 14.08.2019, 05:51   #3
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,210
Репутация: 93
По умолчанию

Скриншоты работы программы.
Миниатюры
Нажмите на изображение для увеличения
Название: 1a.jpg
Просмотров: 45
Размер:	100.5 Кб
ID:	97444   Нажмите на изображение для увеличения
Название: 2a.jpg
Просмотров: 42
Размер:	100.1 Кб
ID:	97445   Нажмите на изображение для увеличения
Название: 3a.jpg
Просмотров: 43
Размер:	101.8 Кб
ID:	97446  
__________________
мой канал на Ютубе: youtube.com/channel/UCdtIJx_8tDGrc9n-Y0JsllA
jura_k вне форума   Ответить с цитированием
Старый 17.08.2019, 22:06   #4
morg@n
Форумчанин
 
Аватар для morg@n
 
Регистрация: 23.06.2019
Сообщений: 175
Репутация: 228
По умолчанию

Цитата:
Сообщение от jura_k Посмотреть сообщение
Начну с вопроса. Почему медленно работает? Что нужно оптимизировать?
Тебе уже неоднократно говорили что твой компьютер древний как фекалии мамонта, но ты же не хочешь слушать. Какие в таком случае могут быть вопросы?

Что же касается твоего топика, то, объясни мне такую вещь, твоя тема кому то нужна чтобы ее здесь выкладывать? Нынче ни кто не работает в той ОС и с той средой что и ты чтобы хоть как то пригодиться кому либо.
morg@n вне форума   Ответить с цитированием
Старый 20.08.2019, 20:09   #5
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,210
Репутация: 93
По умолчанию

Я спрашиваю, как оптимизировать код.
Есть же опытные люди, которые сразу поймут, что еще здесь можно сделать.
__________________
мой канал на Ютубе: youtube.com/channel/UCdtIJx_8tDGrc9n-Y0JsllA
jura_k вне форума   Ответить с цитированием
Старый 20.08.2019, 21:00   #6
morg@n
Форумчанин
 
Аватар для morg@n
 
Регистрация: 23.06.2019
Сообщений: 175
Репутация: 228
По умолчанию

Цитата:
Сообщение от jura_k Посмотреть сообщение
Я спрашиваю, как оптимизировать код.
Есть же опытные люди, которые сразу поймут, что еще здесь можно сделать.
Вы уверенны что нужно оптимизировать код а не сам компьютер? Причин может быть полно и вам сложно что то дельное посоветовать кроме как оптимизировать ПК(а еще лучше, покупать новый). Вы же не написали ни чего по поводу своего железа толком кроме как обозначили процессор, который и так может быть перегружен из за малого объема оперативы или же медленно работать от частоты самой материнки.

p.s. Какой вопрос- такой ответ, а многим тут важна конкретика.
morg@n вне форума   Ответить с цитированием
Старый 20.08.2019, 22:28   #7
WorldMaster
Профессионал
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Адрес: Россия, Мурманск
Сообщений: 2,306
Репутация: 705

icq: 359393755
По умолчанию

Ну цикл дичайший какой то в void draw (CDC *pDC)

Неужели нельзя как то совместить переборы..
__________________
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
Если помог - нажми на весы
WorldMaster вне форума   Ответить с цитированием
Старый 24.08.2019, 17:41   #8
jura_k
вовсе не
Профессионал
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,210
Репутация: 93
По умолчанию

Цитата:
Сообщение от morg@n Посмотреть сообщение
Нынче ни кто не работает в той ОС и с той средой что и ты чтобы хоть как то пригодиться кому либо.
Можно хоть утюг программировать, всё равно это по теме форума.
Утюг, кстати, полезней.
Но эта программа идет и на более продвинутой ОС. У меня, например, под Windows Vista идет. Отсюда и скриншоты в третьем посте.
__________________
мой канал на Ютубе: youtube.com/channel/UCdtIJx_8tDGrc9n-Y0JsllA
jura_k вне форума   Ответить с цитированием
Старый 25.08.2019, 18:49   #9
morg@n
Форумчанин
 
Аватар для morg@n
 
Регистрация: 23.06.2019
Сообщений: 175
Репутация: 228
По умолчанию

Цитата:
Сообщение от jura_k Посмотреть сообщение
Можно хоть утюг программировать, всё равно это по теме форума.
Утюг, кстати, полезней.
Но эта программа идет и на более продвинутой ОС. У меня, например, под Windows Vista идет. Отсюда и скриншоты в третьем посте.
Ты, просто, не понимаешь, даже, для чего существует данный форум.

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

А то, как то, извини, но смысловой нагрузки в твоих постах ноль.
morg@n вне форума   Ответить с цитированием
Старый 09.09.2019, 01:03   #10
Desc
Developer
ФорумчанинФорумчанин
 
Аватар для Desc
 
Регистрация: 21.11.2007
Адрес: Ukraine
Сообщений: 108
Репутация: 51
По умолчанию

За что отвечают:
Цитата:
Сообщение от jura_k Посмотреть сообщение
#include "p3.h"

#include "p3Doc.h"
#include "p3View.h"
Возможно основная проблема именно в них?
__________________
Корректно сформулировал вопрос - приблизился к решению
Desc на форуме   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить программу рисования графика функции y = f i (x) на промежутке (1 - 20). Snow458 Помощь студентам 0 20.12.2016 14:47
Блокировка рисования Вадим Вергун Паскаль 0 29.12.2014 21:02
компонент для рисования графика функции druid777 Компоненты Delphi 1 21.12.2012 20:37
C# Процедура рисования Alexen C# (си шарп) 6 15.10.2010 08:31
Средства для рисования LOST94 Общие вопросы C/C++ 2 07.05.2010 21:23


18:14.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.