亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? curve.cpp

?? Windows 圖形編程 書籍
?? CPP
字號:
//-----------------------------------------------------------------------------------//
//              Windows Graphics Programming: Win32 GDI and DirectDraw               //
//                             ISBN  0-13-086985-6                                   //
//                                                                                   //
//  Written            by  Yuan, Feng                             www.fengyuan.com   //
//  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         //
//  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      //
//                                                                                   //
//  FileName   : curve.cpp						                                     //
//  Description: Path, curve transformation, styled curve                            //
//  Version    : 1.00.000, May 31, 2000                                              //
//-----------------------------------------------------------------------------------//

#define  STRICT
#define  WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <math.h>
#include <assert.h>
#include <tchar.h>

#include "curve.h"
#include "pen.h"

int KPathData::GetPathData(HDC hDC)
{
	if ( m_pPoint ) delete m_pPoint;
	if ( m_pFlag  ) delete m_pFlag;

	m_nCount = ::GetPath(hDC, NULL, NULL, 0);

	if ( m_nCount>0 )
	{
		m_pPoint = new POINT[m_nCount];
		m_pFlag  = new  BYTE[m_nCount];

		if ( m_pPoint!=NULL && m_pFlag!=NULL )
			m_nCount = ::GetPath(hDC, m_pPoint, m_pFlag, m_nCount);
	}

	return m_nCount;
}


void KPathData::MapPoints(K2DMap & map)
{
	for (int i=0; i<m_nCount; i++)
		map.Map(m_pPoint[i].x, m_pPoint[i].y);
}


BOOL KTransCurve::MoveTo(HDC hDC, int x, int y)
{
	m_orgx = x;
	m_orgy = y;

	x0 = (float) x;
	y0 = (float) y;

	Map(x0, y0, m_dstx, m_dsty);

	return DrvMoveTo(hDC, (int) (m_dstx+0.5), (int) (m_dsty+0.5));
}


BOOL KTransCurve::BezierTo(HDC hDC, float x1, float y1, float x2, float y2, float x3, float y3)
{
	float dx3, dy3;

	Map(x3, y3, dx3, dy3);

	if ( ( fabs(dx3-m_dstx) + fabs(dy3-m_dsty) ) < m_seglen ) // no need to break ?
	{
		float dx1, dy1, dx2, dy2;
		
		Map(x1, y1, dx1, dy1);
		Map(x2, y3, dx2, dy2);

		POINT P[3] = {  (int) (dx1+0.5), (int) (dy1+0.5),
						(int) (dx2+0.5), (int) (dy2+0.5),
						(int) (dx3+0.5), (int) (dy3+0.5) };

		x0 = x3;
		y0 = y3;
		m_dstx = dx3;
		m_dsty = dy3;

		return DrvBezierTo(hDC, P);
	}
	else
	{
		BezierTo(hDC, 
			(x0+x1)          /2, (y0+y1)          /2, 
			(x0+x1*2+x2)     /4, (y0+y1*2+y2)     /4, 
			(x0+x1*3+x2*3+x3)/8, (y0+y1*3+y2*3+y3)/8);

		return BezierTo(hDC, 
			(x1+x2*2+x3)/4, (y1+y2*2+y3)/4, 
			(x2+x3)     /2, (y2+y3)     /2, 
			x3, y3);
	}
}
	

BOOL KPathData::Draw(HDC hDC, KTransCurve & trans, bool bPath)
{
	if ( m_nCount==0 )
		return FALSE;

	if ( bPath )
		BeginPath(hDC);

	for (int i=0; i<m_nCount; i++)
	{
		switch ( m_pFlag[i] & ~ PT_CLOSEFIGURE )
		{
			case PT_MOVETO:
				trans.MoveTo(hDC, m_pPoint[i].x, m_pPoint[i].y);
				break;

			case PT_LINETO:
				trans.LineTo(hDC, m_pPoint[i].x, m_pPoint[i].y);
				break;

			case PT_BEZIERTO:
				trans.BezierTo(hDC, 
					m_pPoint[i  ].x, m_pPoint[i  ].y,
					m_pPoint[i+1].x, m_pPoint[i+1].y,
					m_pPoint[i+2].x, m_pPoint[i+2].y);
				i+=2;
				break;

			default:
				assert(false);
		}

		if ( m_pFlag[i] & PT_CLOSEFIGURE )
			trans.CloseFigure(hDC);
	}

	if ( bPath )
		EndPath(hDC);

	return TRUE;
}


BOOL KStyleCurve::LineTo(double x, double y)
{
	double x2 = x;
	double y2 = y;

	double curlen = sqrt((x2-m_x1)*(x2-m_x1) + 
		                 (y2-m_y1)*(y2-m_y1));

	double length = m_pDash->GetLength(m_step);

	while ( curlen >= length )
	{
		double x1 = m_x1; 
		double y1 = m_y1;

		m_x1 += (x2-m_x1) * length / curlen;
		m_y1 += (y2-m_y1) * length / curlen;

		if ( ! m_pDash->DrawDash(x1, y1, m_x1, m_y1, m_step) )
			return FALSE;

		curlen -= length;

		m_step ++;
		length = m_pDash->GetLength(m_step);
	}

	return TRUE;
}


BOOL KStyleCurve::PolyDraw(const POINT *ppt, const BYTE *pbTypes, int nCount)
{
	int lastmovex = 0;
	int lastmovey = 0;

	for (int i=0; i<nCount; i++)
	{
		switch ( pbTypes[i] & ~ PT_CLOSEFIGURE )
		{
			case PT_MOVETO:
				m_x1 = lastmovex = ppt[i].x;
				m_y1 = lastmovey = ppt[i].y;
				break;

			case PT_LINETO:
				if ( ! LineTo(ppt[i].x, ppt[i].y) )
					return FALSE;
				break;
		}

		if ( pbTypes[i] & PT_CLOSEFIGURE )
			if ( ! LineTo(lastmovex, lastmovey) )
				return FALSE;
	}

	return TRUE;
}


void KPathData::MarkPoints(HDC hDC, bool bShowLine)
{
	if ( bShowLine )
	{
		KPen dot(PS_DOT, 0, RGB(0xFF, 0, 0), hDC);
		
		Polyline(hDC, m_pPoint, m_nCount);
	}

	KPen solid(PS_SOLID, 0, RGB(0, 0, 0xFF));
	solid.Select(hDC);

	HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 0xFF));

	for (int i=0; i<m_nCount; i++)
	{
#ifdef _DEBUG
		TCHAR temp[32];

		wsprintf(temp, _T("%3d %d (%d,%d)\n"), i, m_pFlag[i], m_pPoint[i].x, m_pPoint[i].y);
		OutputDebugString(temp);
#endif
		
		int x = m_pPoint[i].x;
		int y = m_pPoint[i].y;

		if ( m_pFlag[i] & PT_CLOSEFIGURE )
			SelectObject(hDC, hBrush);
		else
			SelectObject(hDC, GetStockObject(WHITE_BRUSH));

		switch ( m_pFlag[i] & ~ PT_CLOSEFIGURE )
		{
			case PT_MOVETO:
			{
					POINT P[] = { x, y-6, x+6, y+4, x-6, y+4, x, y-6 };

					Polygon(hDC, P, 4);
				}
				break;

			case PT_LINETO:
				Rectangle(hDC, x-5, y-5, x+5, y+5);
				break;

			case PT_BEZIERTO:
				Ellipse(hDC, x-5, y-5, x+5, y+5);
				break;
		}

	}

	SelectObject(hDC, GetStockObject(WHITE_BRUSH));
	DeleteObject(hBrush);

	solid.UnSelect();
}


BOOL KDashes::DrawDash(double x1, double y1, double x2, double y2, int step)
{
	HBRUSH hBrush = CreateSolidBrush(PALETTEINDEX(step % 20));
	HGDIOBJ hOld  = SelectObject(m_hDC, hBrush);

	SelectObject(m_hDC, GetStockObject(NULL_PEN));
	double dy = (x2-x1)/2;
	double dx = (y2-y1)/2;

	switch ( m_test & 3 )
	{
		case 0: // diamound
		{
			POINT P[5] = { (int)x1, (int)y1, (int)((x1+x2)/2-dx), (int)((y1+y2)/2+dy),
						   (int)x2, (int)y2, (int)((x1+x2)/2+dx), (int)((y1+y2)/2-dy),
						   (int)x1, (int)y1 };
			Polygon(m_hDC, P, 5);
			break;
		}

		case 1: // triangle
		{
			dx /= 0.866; // sqrt(3)/2
			dy /= 0.866;

			POINT P[4] = { (int)(x1-dx), (int)(y1+dy), (int)x2, (int)y2,
				           (int)(x1+dx), (int)(y1-dy), (int)(x1-dx), (int)(y1+dy)
		};
		Polygon(m_hDC, P, 4);
		break;
		}

		case 2: // circle
		{
			double r = sqrt(dx * dx + dy * dy);

			Ellipse(m_hDC, (int)((x1+x2)/2-r), (int)((y1+y2)/2-r),
				           (int)((x1+x2)/2+r), (int)((y1+y2)/2+r));
			break;
		}

		case 3: 
		{
			POINT P[5] = { (int)(x1-dx), (int)(y1+dy), (int)(x2-dx), (int)(y2+dy),
				           (int)(x2+dx), (int)(y2-dy), (int)(x1+dx), (int)(y1-dy),
						   (int)(x1-dx), (int)(y1+dy)
			};
			Polygon(m_hDC, P, 5);
			break;
		}
	}
	
	SelectObject(m_hDC, hOld);
	DeleteObject(hBrush);
	return TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品成人一区二区三区四区| 日韩—二三区免费观看av| 国产成人午夜99999| 国产视频一区不卡| 成人免费av资源| 自拍偷拍国产亚洲| 国产欧美日韩久久| 91社区在线播放| 亚洲国产综合91精品麻豆| 欧美精品少妇一区二区三区| 另类人妖一区二区av| 国产日韩欧美制服另类| 99re热视频精品| 天涯成人国产亚洲精品一区av| 日韩欧美一级特黄在线播放| 高清成人免费视频| 一区二区三区高清不卡| 日韩午夜在线影院| 成人动漫中文字幕| 午夜日韩在线观看| 日本一区二区动态图| 欧美日韩中文精品| 国产毛片精品视频| 日韩美女精品在线| 欧美videofree性高清杂交| 丁香六月久久综合狠狠色| 亚洲一卡二卡三卡四卡五卡| 精品三级av在线| 色综合久久中文综合久久97| 全国精品久久少妇| 中文字幕一区二区三区在线播放 | 亚洲精品一区二区三区影院| 成人的网站免费观看| 首页国产欧美日韩丝袜| 国产欧美精品国产国产专区| 555www色欧美视频| heyzo一本久久综合| 麻豆免费精品视频| 亚洲乱码国产乱码精品精小说 | 欧美午夜精品理论片a级按摩| 韩国一区二区三区| 亚洲国产美国国产综合一区二区| 国产精品网站导航| 日韩欧美国产成人一区二区| 97久久精品人人澡人人爽| 久久不见久久见免费视频7| 一区二区三区四区国产精品| 久久精品欧美日韩| 91精品国产综合久久久蜜臀图片| 99久久国产综合色|国产精品| 麻豆精品一区二区| 亚洲一区二区在线观看视频| 18欧美亚洲精品| 国产精品美女一区二区三区| 久久综合丝袜日本网| 日韩亚洲欧美一区| 欧美伊人精品成人久久综合97| 国产a区久久久| 国产精品亚洲专一区二区三区| 免费成人av在线| 丝袜美腿高跟呻吟高潮一区| 亚洲国产视频a| 亚洲人吸女人奶水| 亚洲色大成网站www久久九九| 亚洲国产精品成人综合色在线婷婷| 欧美成人精品福利| 9191国产精品| 欧美日韩精品久久久| 在线视频一区二区三区| 91久久奴性调教| 日本高清免费不卡视频| 日本韩国欧美在线| 欧美系列一区二区| 欧美三电影在线| 欧美精品一二三| 日韩欧美视频一区| 欧美成人福利视频| 精品久久久久久最新网址| 精品国产乱子伦一区| 在线电影国产精品| 日本伦理一区二区| 欧美午夜免费电影| 69精品人人人人| 日韩欧美色综合网站| 精品国产一区二区三区不卡| 精品久久五月天| 国产精品情趣视频| 亚洲乱码国产乱码精品精的特点 | 中文天堂在线一区| 亚洲色图欧洲色图| 亚洲国产精品一区二区www在线| 性做久久久久久| 久久电影网电视剧免费观看| 国产乱子伦视频一区二区三区| 国产福利91精品一区二区三区| a美女胸又www黄视频久久| 欧洲av一区二区嗯嗯嗯啊| 欧美人与性动xxxx| 久久综合九色综合欧美98| 国产精品久久久久四虎| 亚洲一区二区欧美日韩| 欧美aaaaa成人免费观看视频| 国产九色精品成人porny| 91免费观看国产| 欧美美女黄视频| 久久奇米777| 亚洲欧洲综合另类在线| 免费黄网站欧美| 成人ar影院免费观看视频| 在线亚洲一区二区| 精品国产髙清在线看国产毛片| 国产免费成人在线视频| 一区二区三区在线观看动漫| 免费在线视频一区| 99久久精品国产网站| 欧美一级生活片| 中文字幕日韩av资源站| 丝瓜av网站精品一区二区| 国产盗摄视频一区二区三区| 欧美体内she精高潮| 久久女同精品一区二区| 一区二区三区国产豹纹内裤在线| 狠狠v欧美v日韩v亚洲ⅴ| 在线一区二区三区做爰视频网站| 久久在线观看免费| 午夜精品久久久久久久蜜桃app| 国产精品888| 91精品一区二区三区久久久久久| 国产精品久久久久9999吃药| 男男视频亚洲欧美| 欧美午夜免费电影| 成人免费在线视频观看| 久久99精品久久久| 欧美日本在线一区| 亚洲视频你懂的| 国产成人亚洲综合a∨婷婷| 欧美久久久久久久久| 中文字幕一区二区不卡| 精品一区二区在线看| 欧美性生活久久| 中文字幕日本不卡| 国产精品一卡二卡在线观看| 91精品国产高清一区二区三区蜜臀| 亚洲欧美一区二区三区久本道91| 国产在线一区观看| 日韩欧美国产成人一区二区| 日韩精品亚洲一区二区三区免费| 91无套直看片红桃| 中文字幕不卡的av| 国产精品一卡二卡在线观看| 欧美mv和日韩mv国产网站| 日本麻豆一区二区三区视频| 欧美午夜精品久久久久久孕妇 | 中文字幕亚洲电影| 国产一区欧美日韩| 337p粉嫩大胆色噜噜噜噜亚洲 | 国产盗摄一区二区三区| 日韩精品一区二区三区中文不卡| 亚洲不卡一区二区三区| 在线免费观看日本一区| 亚洲精品高清在线| 色av综合在线| 一区二区三区在线视频观看 | 国产精品美日韩| 不卡av免费在线观看| 欧美激情在线一区二区| 国产成人亚洲精品青草天美| 国产拍欧美日韩视频二区| 国产成人精品免费| 中文字幕一区日韩精品欧美| av电影一区二区| 一区二区三区**美女毛片| 日本韩国精品在线| 亚洲va欧美va国产va天堂影院| 欧美精选午夜久久久乱码6080| 日韩国产在线观看| 欧美r级电影在线观看| 狠狠色丁香婷综合久久| 国产日韩av一区二区| 成人高清视频在线| 亚洲精品va在线观看| 欧美四级电影在线观看| 午夜精品久久久久久久久 | 久久免费看少妇高潮| 高清成人在线观看| 一区二区三区色| 日韩一区二区精品在线观看| 国产精品 日产精品 欧美精品| 国产精品久久久久久久岛一牛影视| 91啪在线观看| 日本不卡一二三| 久久精品视频免费| 色香蕉久久蜜桃| 日本不卡在线视频| 久久久久国产精品麻豆ai换脸 | 欧美精品777| 国产精品99久久久久久久女警| 亚洲欧洲99久久| 337p亚洲精品色噜噜| 国产大片一区二区|