可以把相关知识发到[email protected]
著名ID,一定给分,谢谢啦。
著名ID,一定给分,谢谢啦。
解决方案 »
- MFC中 怎么用set容器,我想在类中定义一个成员出错
- 如何解析ORACLE数据库里面的timestamp类型
- ★★★高分弱问★★★文件包含问题!!!
- RichEidt插入ActiveX的问题--------?网上等????
- 谁写过这个东西NAT(Network Address Translation)
- CDateTimeCtrl可以设置为时间型,如何初始化呢?
- 高分!关于扫描仪的检测.
- 为什么在DialogBar中的按钮无法设置为Disable
- 没有贴错区域的问题 - 参与有分
- MFC如何利用CInternetSession、CHttpConnection和CHttpFile下载动态网页中的链接
- 小弟刚学MFC不久,对按钮有些不懂?如何挑颜色?
- 我做的一个抓包程序占用的cpu资源太多会是什么原因呢?
大概意思就是你建一些点,然后moveto lineto把点连就行了
这里用SetWorldTransform帮你解决问题.本来我想找用Bezier画Ellipse的,没找到. 也是个好方法, 可解决旋转问题.
//椭圆圆弧
Graphics graphics(this->m_hWnd);
Pen redPen(Color::Red,3);
Rect ellipseRect(10,10,200,100);
REAL startAngle=0.0f;
REAL sweepAngle=90.0f;
graphics.DrawArc(&redPen,ellipseRect/*定义弧形的矩形*/,startAngle/*开始角度*/,sweepAngle/*终止角度*/);
//旋转椭圆
Graphics graphics(this->m_hWnd);
Pen greenPen(Color(255,0,255,0),3);
graphics.RotateTransform(30);//旋转绘图平面,你需要旋转的角度
graphics.DrawEllipse(&greenPen,10+150,10+100,100,200);
jinxuliang(smielfox) 的方法我不熟悉,回去试验一下
jyc_nj(老蔣)介绍的是个好办法,但是上面只有椭圆旋转,回去看看能不能加在椭圆弧度上
tmly(铁磨老妖)也谢谢你的介绍,但是我现在是需要自己自由处理
///////////////////////////////////////////////////////////////////////////////
//
// 方法名: EllipseToBezier
// 方法说明: 从椭圆特征点算出Bezier曲线所需之点
// 参数:
// 返回值:
//
// 椭圆示意图:
//
// 2___3___4 --->13个特征点
//
// 1 5
// dbDeltaY<-- | |
// | dbDeltaX |
// 0,12 ------> 6
// | |
// | |
// 11 7
//
// 0___9___8
//
///////////////////////////////////////////////////////////////////////////////void CEllipseHelper::EllipseToBezier(const vector<WKSPoint>& vertexs, vector<WKSPoint>& pts) const
{
ASSERT(13L == pts.size());
const double dbEToBConst=0.2761423749154;// 误差
vector<WKSPoint> cControlPts(4);
SetControlPts(vertexs, cControlPts);
// 椭圆高度及宽度
double dbWidth = MathHelper::Distance(cControlPts[0], cControlPts[2]);
double dbHeight = MathHelper::Distance(cControlPts[1], cControlPts[3]);
// 椭圆倾斜角正弦及余弦值
double dbSinValue = (cControlPts[1].Y - cControlPts[3].Y) / dbHeight;
double dbCosValue = (cControlPts[1].X - cControlPts[3].X) / dbHeight;
// 计算控制点横纵坐标偏移值
double dbDeltaX = dbWidth * dbEToBConst;
double dbDeltaY = dbHeight * dbEToBConst; // 计算生成椭圆的BEZIER曲线控制点
pts[0] = cControlPts[0];
pts[1].X = pts[0].X + dbDeltaY * dbCosValue;
pts[1].Y = pts[0].Y + dbDeltaY * dbSinValue;
pts[11].X = pts[0].X - dbDeltaY * dbCosValue;
pts[11].Y = pts[0].Y - dbDeltaY * dbSinValue;
pts[12] = pts[0];
pts[3] = cControlPts[1];
pts[2].X = pts[3].X - dbDeltaX * dbSinValue;
pts[2].Y = pts[3].Y + dbDeltaX * dbCosValue;
pts[4].X = pts[3].X + dbDeltaX * dbSinValue;
pts[4].Y = pts[3].Y - dbDeltaX * dbCosValue; pts[6] = cControlPts[2];
pts[5].X = pts[6].X + dbDeltaY * dbCosValue;
pts[5].Y = pts[6].Y + dbDeltaY * dbSinValue;
pts[7].X = pts[6].X - dbDeltaY * dbCosValue;
pts[7].Y = pts[6].Y - dbDeltaY * dbSinValue; pts[9] = cControlPts[3];
pts[10].X = pts[9].X - dbDeltaX * dbSinValue;
pts[10].Y = pts[9].Y + dbDeltaX * dbCosValue;
pts[8].X = pts[9].X + dbDeltaX * dbSinValue;
pts[8].Y = pts[9].Y - dbDeltaX * dbCosValue;
}
float x, y;
float angle;
double dangle= 3.1415926536/6;
float f1,f2,f3,f4;
for(int i=0;i<360;i++)
{
angle = i*3.1415926536/180;
f1 = cos(angle+dangle)*cos(-dangle);
f2 = sin(angle+dangle)*sin(-dangle);
f3 = -cos(angle+dangle)*sin(-dangle);
f4 = sin(angle+dangle)*cos(-dangle);
int ra=100,rb=50;
for(int j=0;j<2;j++)
{
x = int(150.5 + ra*f1 + rb*f2);
y = int(150.f + ra*f3 + rb*f4);
*Img.GetPtr(y, x) = 1;
ra-=2;
rb-=2;
}
ra-=2;rb-=2;
for(j=0;j<3;j++)
{
x = int(150.5 + ra*f1 + rb*f2);
y = int(150.f + ra*f3 + rb*f4);
*Img.GetPtr(y, x) = 2;
ra-=2;
rb-=2;
}
} float xangle = atan(tan(-dangle)/2)-dangle;
x = int(150.5f + 100*cos(xangle+dangle)*cos(-dangle) + 50*sin(xangle+dangle)*sin(-dangle));
y = int(150.5f - 100*cos(xangle+dangle)*sin(-dangle) + 50*sin(xangle+dangle)*cos(-dangle));
*Img.GetPtr(y, x) = 3;//椭圆上x最大的点
float yangle = atan(-1/tan(-dangle)/2)-dangle;
x = int(150.5f + 100*cos(yangle+dangle)*cos(-dangle) + 50*sin(yangle+dangle)*sin(-dangle));
y = int(150.5f - 100*cos(yangle+dangle)*sin(-dangle) + 50*sin(yangle+dangle)*cos(-dangle));
*Img.GetPtr(y, x) = 3;;//椭圆上y最大的点
Img.SetPalEntry(1, 0,255,0);
Img.SetPalEntry(2, 255,0,0);
Img.SetPalEntry(3, 255,255,255);
另外,用bezier拟合速度肯定比lineto要快,因为画bezier曲线内部微软优化了。