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

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

?? xtube.cpp

?? 實現南京公交線路的查詢
?? CPP
字號:

#include "Stdafx.h"

#include "XTube.h"

#include <math.h>
const float pi = 3.1415926535f;

XTube::XTube (REAL width, Color lColor, Color oColor)
{
	lineWidth = width;

	outlineColor = oColor;
	lineColor = lColor;

	defLeftColor = lineColor;
	defRightColor = lineColor;
	defStartColor = lineColor;
	defEndColor = lineColor;

	defCircleOutlineColor = Color (255, 0, 0, 0);
	defCircleFillColor = Color (255, 255, 255, 255);

	defFontColor = Color (255, 255, 0, 0);
	defFontFace = "Arial";
	defFontHeight = 6;
	defFontStyle = FontStyleRegular;

	defFont = NULL;
}

XTube::~XTube ()
{
	delete defFont;
}

XTube::XTube (const XTube& obj)
{
	*this = obj;
}

XTube& XTube::operator = (const XTube& obj)
{
	if (this == &obj)
		return *this;

	lineWidth = obj.lineWidth;
	outlineColor = obj.outlineColor;
	lineColor = obj.lineColor;

	defLeftColor = obj.defLeftColor;
	defRightColor = obj.defRightColor;
	defStartColor = obj.defStartColor;
	defEndColor = obj.defEndColor;

	defCircleOutlineColor = obj.defCircleOutlineColor;
	defCircleFillColor = obj.defCircleFillColor;

	defFontColor = obj.defFontColor;
	defFontFace = obj.defFontFace;
	defFontHeight = obj.defFontHeight;
	defFontStyle = obj.defFontStyle;

	defFont = new Font (CStringW(defFontFace).GetBuffer(), defFontHeight, defFontStyle);

	spots = obj.spots;
	for (size_t i = 0; i < spots.size (); i ++)
		spots[i].SetParent (this);

	return *this;
}

int XTube::Append (XSpot& spot)
{
	spot.SetParent (this);

	if (spots.size () > 0 && spots[spots.size()-1].GetType () == STE_END)
		spots[spots.size()-1].SetType (STE_AUTO);

	spots.push_back(spot);

	return (int) spots.size ();
}

int XTube::Move (float x, float y)
{
	for (size_t i = 0; i < spots.size (); i ++)
		spots[i].Move (x, y);

	return 0;
}

int XTube::Recalculate ()
{
	if (spots.size () < 2) return -1;

	float radius = lineWidth*2; //拐彎半徑

	//計算left, right
	//計算每個點的斜率,用角度表達
	for (size_t i = 1; i < spots.size (); i ++)
	{
		float dx = spots[i].position.X - spots[i-1].position.X;
		float dy = spots[i].position.Y - spots[i-1].position.Y;

		if (dx*dx + dy*dy < 4*radius*radius) //距離太短,不足以拐彎
			continue;

		if (fabs(dx) == 0) //垂直
		{
			spots[i-1].right = PointF (spots[i-1].position.X, dy > 0 ? spots[i-1].position.Y+radius : spots[i-1].position.Y-radius);
			spots[i].left = PointF (spots[i].position.X, dy > 0 ? spots[i].position.Y-radius : spots[i].position.Y+radius);
		}
		else if (fabs(dy) == 0) //水平
		{
			spots[i-1].right = PointF (dx > 0 ? spots[i-1].position.X+radius : spots[i-1].position.X-radius, spots[i-1].position.Y);
			spots[i].left = PointF (dx > 0 ? spots[i].position.X-radius : spots[i].position.X+radius, spots[i].position.Y);
		}
		else //斜線
		{
			float k = dy/dx;

			float x = sqrtf (radius*radius/(1+k*k));
			if (dx < 0) x = -x;

			float y = k*x;

			spots[i-1].right = PointF (spots[i-1].position.X+x, spots[i-1].position.Y+y);
			spots[i].left = PointF (spots[i].position.X-x, spots[i].position.Y-y);
		}

		spots[i-1].angle = atan2f (dy, dx) * 360 / (2*pi);
		if (spots[i-1].angle < 0) spots[i-1].angle += 360; //保證在0-360之間
	}
	spots[spots.size()-1].left = spots[spots.size()-1].position;
	spots[spots.size()-1].right = spots[spots.size()-1].position;
	spots[spots.size()-1].angle = spots[spots.size()-2].angle;

	//計算拐彎的中心點,半徑,角度
	for (size_t i = 1; i < spots.size ()-1; i ++)
	{
		REAL angle1 = spots[i-1].angle + 180;
		REAL angle2 = spots[i].angle;
		if (angle1 > 360) angle1 -= 360;

		//<<
		//如果角度太小
		//如果長度太短
		//不拐彎
		//if (fabs(180 - fabs(angle2 - angle1)) < 15)
		//	continue;

		if (spots[i].left.X == spots[i].position.X && spots[i].left.Y == spots[i].position.Y)
			continue;

		if (spots[i].right.X == spots[i].position.X && spots[i].right.Y == spots[i].position.Y)
			continue;
		//>>

		bool clockwise = false;
		if (angle1 < 180)
		{
			if (angle2 > angle1 && angle2 < angle1+180) //順時針
				clockwise = true;
			else //逆時針
				clockwise = false;
		}
		else //angle1 >= 180
		{
			if (angle2 > angle1-180 && angle2 < angle1) //逆時針
				clockwise = false;
			else //順時針
				clockwise = true;
		}

		//<<計算拐彎的起始角,角度大小
		spots[i].sweepAngle = fabsf (angle2 - angle1);
		if (spots[i].sweepAngle > 180)
			spots[i].sweepAngle = 360 - spots[i].sweepAngle;
		spots[i].sweepAngle = 180 - spots[i].sweepAngle;

		if (clockwise)
		{
			spots[i].startAngle = (angle1 + 270) > 360 ?  (angle1 + 270) - 360 : (angle1 + 270);
			spots[i].sweepAngle = - spots[i].sweepAngle;
		}
		else
		{
			spots[i].startAngle = (angle1 + 90) > 360 ? (angle1 + 90) - 360 : (angle1 + 90);
		}
		//>>

		//TRACE3 ("clockWise=%d, startAngle=%d, sweepAngle=%d\n", clockwise, spots[i].startAngle, spots[i].sweepAngle);

		//<<計算半徑和中心點
		float dx1 = spots[i].position.X - spots[i].left.X;
		float dy1 = spots[i].position.Y - spots[i].left.Y;
		float dx2 = spots[i].position.X - spots[i].right.X;
		float dy2 = spots[i].position.Y - spots[i].right.Y;

		if (fabsf (dy1) == 0) //
		{
			//y = kx + b, k = - dx2/dy2
			float b2 = spots[i].right.Y + spots[i].right.X * dx2 / dy2;

			spots[i].center.X = spots[i].left.X;
			spots[i].center.Y = b2 - spots[i].center.X * dx2 / dy2;

			spots[i].radius = fabsf (spots[i].center.Y - spots[i].left.Y);
		}
		else if (fabsf (dy2) == 0)
		{
			float b1 = spots[i].left.Y + spots[i].left.X * dx1 / dy1;

			spots[i].center.X = spots[i].right.X;
			spots[i].center.Y = b1 - spots[i].center.X * dx1 / dy1;

			spots[i].radius = fabsf (spots[i].center.Y - spots[i].right.Y);
		}
		else //都是斜線
		{
			float b1 = spots[i].left.Y + spots[i].left.X * dx1 / dy1;
			float b2 = spots[i].right.Y + spots[i].right.X * dx2 / dy2;

			spots[i].center.X = (b2 - b1) / (dx2/dy2 - dx1/dy1);
			spots[i].center.Y = b1 - spots[i].center.X * dx1/dy1;

			float r1 = sqrtf ((spots[i].center.X - spots[i].right.X)*(spots[i].center.X - spots[i].right.X)
				+ (spots[i].center.Y - spots[i].right.Y)*(spots[i].center.Y - spots[i].right.Y));
			float r2 = sqrtf ((spots[i].center.X - spots[i].left.X)*(spots[i].center.X - spots[i].left.X)
				+ (spots[i].center.Y - spots[i].left.Y)*(spots[i].center.Y - spots[i].left.Y));

			spots[i].radius = (r1+r2)/2;
		}

		//TRACE ("i=%d, x=%f, y=%f, radius=%f\n", i, spots[i].center.X, spots[i].center.Y, spots[i].radius);
	}
	spots[0].center = spots[0].position;
	spots[0].radius = 0;
	spots[0].startAngle = 0;
	spots[0].sweepAngle = 0;

	spots[spots.size()-1].center = spots[spots.size()-1].position;
	spots[spots.size()-1].radius = 0;
	spots[spots.size()-1].startAngle = 0;
	spots[spots.size()-1].sweepAngle = 0;

	//計算中心點的有關參數
	for (size_t i = 0; i < spots.size (); i ++)
	{
		REAL angle1 = i > 0 ? spots[i-1].angle + 180 : spots[0].angle;
		REAL angle2 = spots[i].angle;
		if (angle1 > 360) angle1 -= 360;

		//從拐彎中心點到曲線中心點的角度
		if (i == 0)
			spots[i].ANGLE = spots[0].angle + 270;
		else if (i == spots.size () -1)
			spots[i].ANGLE = spots[spots.size () -1].angle + 270;
		else
			spots[i].ANGLE = (angle1 + angle2)/2;

		//<<判斷方向
		int kx = 1;
		int ky = 1;
		if (spots[i].center.X > spots[i].position.X) kx = -1;
		if (spots[i].center.Y > spots[i].position.Y) ky = -1;
		//>>

		if (spots[i].ANGLE > 360) spots[i].ANGLE -= 360;

		float K = fabsf (tanf (spots[i].ANGLE*2*pi/360));
		float dx = sqrtf (spots[i].radius*spots[i].radius/(1+K*K));
		float dy = dx*K;

		//<<計算A點
		if (fabs(spots[i].sweepAngle) >= 15) //判斷是否拐彎,如果不拐彎,不用計算A點
		{
			spots[i].A.X = spots[i].center.X + dx*kx;
			spots[i].A.Y = spots[i].center.Y + dy*ky;
		}
		//>>

		dx = sqrtf (lineWidth*lineWidth/(1+K*K));
		dy = dx*K;

		//<<
		float sweep = angle2 - angle1;
		if (angle2 < angle1) sweep += 360;
		if (sweep < 180)
		{
			kx = -kx;
			ky = -ky;
		}
		//>>

		//計算B1, B2
		spots[i].B1.X = spots[i].A.X + dx*kx*1.5f;
		spots[i].B1.Y = spots[i].A.Y + dy*ky*1.5f;
		spots[i].B2.X = spots[i].A.X - dx*kx*1.5f;
		spots[i].B2.Y = spots[i].A.Y - dy*ky*1.5f;

		//計算C1, C2
		if (i == 0)
		{
			kx = spots[0].position.X > spots[1].position.X ? 1 : -1;
			ky = spots[0].position.Y > spots[1].position.Y ? 1 : -1;

			spots[i].C1.X = spots[i].A.X + 2*dy*kx;
			spots[i].C1.Y = spots[i].A.Y + 2*dx*ky;

			spots[i].C2.X = spots[i].A.X - 2*dy*kx;
			spots[i].C2.Y = spots[i].A.Y - 2*dx*ky;
		}
		else if (i == spots.size () -1 )
		{
			kx = spots[spots.size()-1].position.X > spots[spots.size()-2].position.X ? 1 : -1;
			ky = spots[spots.size()-1].position.Y > spots[spots.size()-2].position.Y ? 1 : -1;

			spots[i].C1.X = spots[i].A.X + 2*dy*kx;
			spots[i].C1.Y = spots[i].A.Y + 2*dx*ky;

			spots[i].C2.X = spots[i].A.X - 2*dy*kx;
			spots[i].C2.Y = spots[i].A.Y - 2*dx*ky;
		}
		else
		{
			spots[i].C1.X = spots[i].A.X + 3*dx*kx;
			spots[i].C1.Y = spots[i].A.Y + 3*dy*ky;
			spots[i].C2.X = spots[i].A.X - 3*dx*kx;
			spots[i].C2.Y = spots[i].A.Y - 3*dy*ky;
		}
		//TRACE ("i=%d, A.X=%f, A.Y=%f\n", i, spots[i].A.X, spots[i].A.Y);
	}

	return 0;
}

int XTube::Draw (Graphics* g)
{
	DrawLines (g);
	DrawSpots (g);

	return 0;
}

int XTube::DrawLines (Graphics* g)
{
	if (spots.size () < 2) return 0;

	Pen linePen (lineColor, lineWidth);
	linePen.SetLineJoin (LineJoinRound);

	if (lineWidth > 2)
	{
		GraphicsPath path;

		PointF lastPoint = spots[0].position;
		for (size_t i = 1; i < spots.size (); i ++)
		{
			//如果角度基本相同,畫直線
			if (fabs(spots[i].sweepAngle) >= 15) //角度太小
			{
				path.AddLine (lastPoint, spots[i].left);

				path.AddArc (spots[i].center.X - spots[i].radius, spots[i].center.Y - spots[i].radius,
					spots[i].radius*2, spots[i].radius*2, spots[i].startAngle, spots[i].sweepAngle);
				lastPoint = spots[i].right;
			}
			else
			{
				path.AddLine (lastPoint, spots[i].position);
				lastPoint = spots[i].position;
			}
		}

		path.Widen (&linePen);
		path.Outline ();

		g->SetSmoothingMode(SmoothingModeAntiAlias);

		SolidBrush lineBrush (lineColor);
		g->FillPath (&lineBrush, &path);
	}
	else
	{
		PointF lastPoint = spots[0].position;
		for (size_t i = 1; i < spots.size (); i ++)
		{
/*
			//如果角度基本相同,畫直線
			if (fabs(spots[i].sweepAngle) >= 15) //角度太小
			{
				g->DrawLine (&linePen, lastPoint, spots[i].left);

				g->DrawArc (&linePen, spots[i].center.X - spots[i].radius, spots[i].center.Y - spots[i].radius,
					spots[i].radius*2, spots[i].radius*2, spots[i].startAngle, spots[i].sweepAngle);
				lastPoint = spots[i].right;
			}
			else
*/
			{
				g->DrawLine (&linePen, lastPoint, spots[i].position);
				lastPoint = spots[i].position;
			}
		}
	}

	return 0;
}

int XTube::DrawSpots (Graphics* g, map<CString, PointF>* spotMap)
{
	delete defFont;
	defFont = new Font (CStringW(defFontFace).GetBuffer(), defFontHeight, defFontStyle);

	for (size_t i = 0; i < spots.size (); i ++)
		spots[i].Draw (g, spotMap);

	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合999| 99re成人精品视频| 一本色道a无线码一区v| 日韩免费视频线观看| 亚洲天堂av一区| 久久66热re国产| 91黄色免费观看| 日本一区二区三区四区| 日本欧美一区二区| 91老师国产黑色丝袜在线| 国产丝袜在线精品| 久久精品99国产精品日本| 欧美三级在线播放| 亚洲欧洲制服丝袜| 成人影视亚洲图片在线| 精品理论电影在线观看| 日韩高清电影一区| 91黄色激情网站| 成人欧美一区二区三区| 国产成人在线影院| 精品免费日韩av| 男女男精品视频网| 精品视频一区二区三区免费| 亚洲三级视频在线观看| 国产成人精品一区二| 精品电影一区二区三区 | 欧美久久久影院| 亚洲黄色在线视频| 色综合天天视频在线观看 | 一本久久综合亚洲鲁鲁五月天 | 欧美日韩成人在线一区| 亚洲少妇中出一区| 成人三级在线视频| 日本一区二区三区久久久久久久久不 | 色素色在线综合| 中文字幕亚洲区| 成人综合激情网| 国产亚洲精品精华液| 黑人巨大精品欧美黑白配亚洲| 欧美一区二区视频在线观看2020| 亚洲成人www| 欧美日本视频在线| 亚洲国产成人av网| 欧美性受xxxx| 亚洲婷婷国产精品电影人久久| 97久久精品人人爽人人爽蜜臀| 国产精品的网站| 91亚洲大成网污www| 自拍偷在线精品自拍偷无码专区| thepron国产精品| 亚洲欧洲日产国码二区| 91麻豆精品视频| 亚洲一区二区三区四区在线| 色欧美片视频在线观看在线视频| 亚洲国产综合人成综合网站| 欧美熟乱第一页| 日产国产欧美视频一区精品| 日韩一级片在线观看| 97久久久精品综合88久久| 亚洲区小说区图片区qvod| 成人黄色av电影| 亚洲美女免费在线| 色香蕉成人二区免费| 午夜成人免费视频| 日韩欧美一区二区免费| 国产精品资源在线看| 国产精品免费观看视频| 色久优优欧美色久优优| 亚洲成av人影院| 亚洲精品一区二区三区精华液| 国产成人日日夜夜| 亚洲丝袜美腿综合| 欧美日韩高清一区二区不卡| 激情五月婷婷综合网| 国产精品每日更新| 91免费观看视频| 亚洲成人免费电影| 欧美大片一区二区| hitomi一区二区三区精品| **欧美大码日韩| 在线播放日韩导航| 精品一区二区三区影院在线午夜| 欧美国产综合色视频| 欧美最新大片在线看| 久国产精品韩国三级视频| 国产精品成人免费精品自在线观看| 欧美图区在线视频| 麻豆久久久久久久| 亚洲天堂av老司机| 欧美成人女星排行榜| 不卡一二三区首页| 日韩不卡一区二区三区| 国产婷婷色一区二区三区在线| 在线视频你懂得一区| 久久国产剧场电影| 综合色天天鬼久久鬼色| 日韩欧美一二区| 91在线你懂得| 看片网站欧美日韩| 亚洲欧美偷拍卡通变态| 日韩精品最新网址| 91蝌蚪国产九色| 国产一区日韩二区欧美三区| 亚洲欧美一区二区三区国产精品| 欧美一级一区二区| www.日韩在线| 免费日本视频一区| 亚洲日本一区二区| 欧美精品一区二区三区蜜桃视频| 国产在线精品一区二区三区不卡| 自拍偷拍亚洲欧美日韩| 精品免费日韩av| 欧美日韩综合不卡| 成人黄色在线视频| 另类小说图片综合网| 亚洲与欧洲av电影| 欧美极品另类videosde| 日韩午夜精品视频| 99精品视频一区二区三区| 经典一区二区三区| 午夜精品久久久久久久久久| 亚洲欧洲精品天堂一级| 精品国产一区二区三区四区四| 欧美日韩中字一区| 99综合影院在线| 国产成人免费网站| 久久99久久久久久久久久久| 亚洲一区二区av电影| 国产精品热久久久久夜色精品三区| 日韩欧美一区在线| 5566中文字幕一区二区电影| 91美女片黄在线观看91美女| 国产精品一级在线| 美女一区二区久久| 视频一区二区中文字幕| 亚洲精品一卡二卡| 自拍偷拍亚洲欧美日韩| 欧美国产日本韩| 久久久久一区二区三区四区| 日韩欧美一级二级三级久久久| 欧美视频在线观看一区二区| 色综合久久久久久久久| 成人h动漫精品一区二区| 国产真实乱子伦精品视频| 日韩激情av在线| 午夜在线成人av| 亚洲私人黄色宅男| 亚洲天堂中文字幕| 国产精品理论片在线观看| 国产欧美精品在线观看| 精品对白一区国产伦| 亚洲精品一区二区三区香蕉| 精品国产髙清在线看国产毛片 | 丝袜美腿一区二区三区| 亚洲国产精品久久久久婷婷884| 亚洲伦理在线精品| 亚洲激情六月丁香| 亚洲欧洲中文日韩久久av乱码| 亚洲三级在线看| 一区二区久久久久久| 一区二区三区四区乱视频| 亚洲免费观看视频| 伊人婷婷欧美激情| 一区二区三区四区在线播放| 亚洲欧美国产高清| 一区二区成人在线| 亚洲一区二区欧美日韩 | 国产精品久久久久久久久晋中| 国产日韩精品一区二区三区| 国产欧美日韩不卡| 国产精品伦一区二区三级视频| 日韩伦理av电影| 一区二区三区成人| 天天影视网天天综合色在线播放| 天堂影院一区二区| 久久超碰97人人做人人爱| 在线观看亚洲精品| 欧美日韩激情一区二区三区| 884aa四虎影成人精品一区| 日韩一级成人av| 26uuu国产日韩综合| 中文文精品字幕一区二区| 亚洲精品国久久99热| 亚洲18影院在线观看| 六月丁香婷婷色狠狠久久| 国产丶欧美丶日本不卡视频| 99久久精品久久久久久清纯| 欧美视频中文字幕| 欧美大片在线观看| 国产精品视频麻豆| 亚洲一区欧美一区| 老司机精品视频线观看86| 国产精品一区二区视频| 91视频.com| 欧美精品三级日韩久久| 久久精品视频在线看| 一区二区三区四区亚洲| 日本午夜精品一区二区三区电影 | 久久久国产午夜精品| 国产精品第13页|