Страница 1 из 1

рисование графика на форме.

Добавлено: 22 дек 2009, 23:07
inlaf
собственно, задание. построить спираль.
с центром в координатах 0.0
задающуюся параметрическими уравнениями.

х = х(0) + R*(1-t*t)/(1+t*t)
y = y(0) + R*2*t/(1+t*t)
t = [0,1]
x(0),y(0). начало координат.

не рисует график. не разбирусь в чем ошибка. подсобите пожалуйста.

Код: Выделить всё

void CSANIAView::OnDraw(CDC* pDC)
{
	CSANIADoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;
	CRect rect;
	GetWindowRect(&rect);



	CFont font;
	font.CreateFont(16,0,0,0,FW_NORMAL,0,0,0,
		DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
		DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,_T("Comic Sans MS"));
	CFont *pOldFon = pDC->SelectObject(&font);

	CBrush MyBrush(RGB(100,150,100));
	pDC->SelectObject(&MyBrush);
	//Определение Толщины заданных линий
	CPen MyPen(PS_DASHDOT,3,COLORREF(0));
	CPen *pOldPen = pDC->SelectObject(&MyPen);

	int mx=rect.Width()/2;
	int my=rect.Height()/2;

	int x(0),y(0);
	double t(0);
	double rad=3.14/180;
	x=x+(rad*((1-t*t)/(1+t*t)));
	y=y+(rad*2*t/(1+t*t));
	pDC->MoveTo(mx+x*mx/320,my+y*my/240);

	for(t=0;t<=1;t+=0.01)
	{  
		x=x+(rad*((1-t*t)/(1+t*t)));
		y=y+(rad*2*t/(1+t*t));
		pDC->LineTo(mx+x*mx/320,my+y*my/240);
	}
	//pDC->FloodFill(mx+2,my+2,0);


	//Координатная сетка

	pDC->MoveTo(80*mx/320,my);
	pDC->LineTo(2*mx-80*mx/320,my);//Ось абсцисс

	pDC->MoveTo(mx,15*my/240);
	pDC->LineTo(mx,2*my-15*my/240);//Ось ординат


	//Стрелка абсцисс
	pDC->MoveTo(2*mx-80*mx/320,my);
	pDC->LineTo(2*mx-105*mx/320,my+15*my/240);
	pDC->MoveTo(2*mx-80*mx/320,my);
	pDC->LineTo(2*mx-105*mx/320,my-15*my/240);
	//Стрелка Ординат
	pDC->MoveTo(mx,15*my/240);
	pDC->LineTo(mx+15*mx/320,50*my/240);
	pDC->MoveTo(mx,15*my/240);
	pDC->LineTo(mx-15*mx/320,50*my/240);
	pDC->SelectObject(pOldPen);//Жирность линий
	//Сетка
	int in;
	for(in=0;in<=10;in++)
	{
		//Ординаты

		pDC->MoveTo(80*mx/320,(15+in*45)*my/240);
		pDC->LineTo(2*mx-80*mx/320,(15+in*45)*my/240);
		CString str;
		const CSize cszStr(pDC->GetTextExtent(str));
		pDC->TextOut(mx,(15+in*45)*my/240,str);
		//Абсциссы
		pDC->MoveTo((80+in*48)*mx/320,15*my/240);
		pDC->LineTo((80+in*48)*mx/320,2*my-15*my/240);
		//pDC->TextOut(mx,(15+in*45)*my/240);
	}
}

Re: рисование графика на форме.

Добавлено: 23 дек 2009, 00:09
WinMain
Чтобы построить график кривой, обычно задаётся сначала массив точек с координатами X и Y, а затем все эти точки соедиляются в одну сплошную линию (метод CDC::PoliLine()).
Можешь прочитать об этом в моей статье...
http://winmain.epage.ru/shapes/manual.html
Там как раз есть пример построения спирали. Там же имеется исходный код на Visual C++. Только для отрисовки я использовал библиотеку GDI+, но в данном случае это не принципиально.

Re: рисование графика на форме.

Добавлено: 23 дек 2009, 00:12
Newbie
самое главное! у тебя x и y всегда 0! из-за неверного приведения типов
подумай, что воспримет компилятор
1-t*t => int - double (= 0.00001) с учетом, того что он считает слева на право
Он округлит double до 0 в результате у тебя x и y всегда 0.
Но все равно не будут рисоваться линии) просто указал на явный косяк.

Re: рисование графика на форме.

Добавлено: 24 дек 2009, 01:13
inlaf
спасибо.
а подобного на MFC нету?

неразбериха полная с этим рисованием(