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

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

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

Начну с вопроса. Почему медленно работает? Что нужно оптимизировать?
Ну не может быть так, чтобы мой мощный 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
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,275
По умолчанию

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

Скриншоты работы программы.
Изображения
Тип файла: jpg 1a.jpg (100.5 Кб, 110 просмотров)
Тип файла: jpg 2a.jpg (100.1 Кб, 114 просмотров)
Тип файла: jpg 3a.jpg (101.8 Кб, 105 просмотров)
мой канал на Ютубе: youtube.com/channel/UCdtIJx_8tDGrc9n-Y0JsllA
jura_k вне форума Ответить с цитированием
Старый 17.08.2019, 22:06   #4
morg@n
Форумчанин
 
Аватар для morg@n
 
Регистрация: 23.06.2019
Сообщений: 257
По умолчанию

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

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

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

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

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

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

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

Цитата:
Сообщение от 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
Сообщений: 257
По умолчанию

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

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

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить программу рисования графика функции y = f i (x) на промежутке (1 - 20). Snow458 Помощь студентам 0 20.12.2016 14:47
Блокировка рисования Вадим Вергун Паскаль, Turbo Pascal, PascalABC.NET 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