如何按照45度角度画线? CPoint pt1(100,90);CPoint pt2(400,400); pDC->MoveTo(pt1);pDC->LineTo(pt2);这是一个斜线,要求从pt2位置以45度角度向上画一条线,谢谢了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CPoint pt1(100,90);CPoint pt2(400,400);CPoint pt3(500,300);pDC->MoveTo(pt1);pDC->LineTo(pt2); pDC->LineTo(pt3); 45度不是太简单了,连三角函数都不要,x,y个加三百像素就成了。向右上45的就这样pDC->MoveTo(pt2);pt2.x+=400;pt2.y-=400;pDC->LineTo(pt2); 我要的是计算过程,pt1,pt2是任意可变数字。都说简单,没一个给出具体计算过程的? 长度应该固定的吧,p2.x=p1.x+length*sin(45);p2.y=p2.y+length*cos(45) 我自己写的,发你看看,你先把直线求出来,然后调用这个//坐标转换//BasePoint为直线起点,把他作为原点旋转//TransPoint为需要转换的点//Angle为需要转换的角度CPoint CCLaneView::CoordTransformation(CPoint BasePoint, CPoint TransPoint, double Angle){ CPoint ptRt; int xx1, yy1; double len = sqrt((TransPoint.x-BasePoint.x) * (TransPoint.x-BasePoint.x) + (TransPoint.y-BasePoint.y) * (TransPoint.y-BasePoint.y)); double ang = GetAngle( BasePoint, TransPoint ); //转换后的坐标 xx1 = int(BasePoint.x + len * cos(Angle+ang )); yy1 = int(BasePoint.y + len * sin(Angle+ang )); ptRt.x = xx1; ptRt.y = yy1; return ptRt;} //求2点间的线段相对与水平线的夹角//BasePoint为线段起点//TransPoint为线段的终点double CCLaneView::GetAngle(CPoint BasePoint, CPoint TransPoint){ //Added by zhaobin at 2007/11/9 //求atan即可,不需要acos double len = sqrt((TransPoint.x-BasePoint.x) * (TransPoint.x-BasePoint.x) + (TransPoint.y-BasePoint.y) * (TransPoint.y-BasePoint.y)); double angle; if (((BasePoint.x - TransPoint.x) == 0 ) && ((BasePoint.y-TransPoint.y) == 0)) angle = 0; else if ((BasePoint.x - TransPoint.x) == 0) { if(TransPoint.y>BasePoint.y ) angle = pi / 2; else angle = pi * 3 / 2; } else if((BasePoint.y-TransPoint.y) == 0) { if(BasePoint.x>TransPoint.x) angle = pi; else angle = 0; } else { double kk = (double)((TransPoint.x-BasePoint.x) / len); angle = (double)acos(kk); if(TransPoint.y < BasePoint.y) angle = (pi * 2) - angle; } return angle;}这个函数写的很笨,直接用atan2就可以得到角度了... //斜率float theta = 45*Pi/180;k = tan(theta);y = k*x - k*pt2.x + pt2.y;//直线方程直线方程都可以求出来,那么直线上任意一点都可以求了 45度吗,就是正方形对角线了,只要前后两个点对应的坐标值的x和y的差值相同就没有问题了,应该是这样。即:x1-x2=y1-y2CPoint pt1(200,200); CPoint pt2(400,400); pDC->MoveTo(pt1); pDC->LineTo(pt2); mfc 对话框的none样式对应的风格是哪几种?如果通过调用函数到达那种风格 实时图像怎样实现缩小显示到控件上? 问两个activex 控件问题(tab和tooltip) DLL导出类的成员函数 工具栏图标问题 工具条 创建、读写、修改ini文件 对话框 文本框TextBox的问题,在线求救!急! 想仿照侯捷用CTypedPtrList,应include哪个头文件? 有关消息队列 请教3D游戏中3D模型的表面坐标
CPoint pt2(400,400);
CPoint pt3(500,300);pDC->MoveTo(pt1);
pDC->LineTo(pt2);
pDC->LineTo(pt3);
向右上45的就这样
pDC->MoveTo(pt2);
pt2.x+=400;
pt2.y-=400;
pDC->LineTo(pt2);
都说简单,没一个给出具体计算过程的?
p2.x=p1.x+length*sin(45);
p2.y=p2.y+length*cos(45)
//BasePoint为直线起点,把他作为原点旋转
//TransPoint为需要转换的点
//Angle为需要转换的角度
CPoint CCLaneView::CoordTransformation(CPoint BasePoint, CPoint TransPoint, double Angle)
{
CPoint ptRt;
int xx1, yy1;
double len = sqrt((TransPoint.x-BasePoint.x) * (TransPoint.x-BasePoint.x) + (TransPoint.y-BasePoint.y) * (TransPoint.y-BasePoint.y));
double ang = GetAngle( BasePoint, TransPoint ); //转换后的坐标
xx1 = int(BasePoint.x + len * cos(Angle+ang ));
yy1 = int(BasePoint.y + len * sin(Angle+ang ));
ptRt.x = xx1;
ptRt.y = yy1;
return ptRt;
}
//BasePoint为线段起点
//TransPoint为线段的终点
double CCLaneView::GetAngle(CPoint BasePoint, CPoint TransPoint)
{
//Added by zhaobin at 2007/11/9
//求atan即可,不需要acos
double len = sqrt((TransPoint.x-BasePoint.x) * (TransPoint.x-BasePoint.x) + (TransPoint.y-BasePoint.y) * (TransPoint.y-BasePoint.y));
double angle;
if (((BasePoint.x - TransPoint.x) == 0 ) && ((BasePoint.y-TransPoint.y) == 0))
angle = 0;
else if ((BasePoint.x - TransPoint.x) == 0)
{
if(TransPoint.y>BasePoint.y )
angle = pi / 2;
else
angle = pi * 3 / 2;
}
else if((BasePoint.y-TransPoint.y) == 0)
{
if(BasePoint.x>TransPoint.x)
angle = pi;
else
angle = 0;
}
else
{
double kk = (double)((TransPoint.x-BasePoint.x) / len);
angle = (double)acos(kk);
if(TransPoint.y < BasePoint.y)
angle = (pi * 2) - angle;
}
return angle;
}这个函数写的很笨,直接用atan2就可以得到角度了...
//斜率
float theta = 45*Pi/180;
k = tan(theta);
y = k*x - k*pt2.x + pt2.y;//直线方程直线方程都可以求出来,那么直线上任意一点都可以求了
45度吗,就是正方形对角线了,只要前后两个点对应的坐标值的x和y的差值相同就没有问题了,应该是这样。即:x1-x2=y1-y2
CPoint pt1(200,200);
CPoint pt2(400,400); pDC->MoveTo(pt1);
pDC->LineTo(pt2);