如何画斜的椭圆啊,一般矩形内切圆都是水平的。
解决方案 »
- 怎么样防止程序被注入?我发现注入某些程序的时候就自动崩溃了。
- 如何在MFC中通过编辑框读入数组?
- Kodak Image Edit控件图片缩小
- 讨论:如何delete动态数组的某些元素?thx
- 用malloc申请 0 空间,返回的地址不为NULL吗??如果是,有没有返回为NULL的申请空间函数??
- 高分请问怎么样编程发送一个消息给QQ,只发送就行,不用接收!!!
- 注册表子键改名的问题
- 请问哪位有关GIF文件格式的资料及操作方面的示例源码?
- 用 CDC 类里的函数会出现很多内存泄漏,请问大家有什么好的方法杜绝?
- "一句话晒正版,赢精美礼品
- 如何调用COM组件里的事件?
- 请问如何取得网页中某个特定的数据????
http://www.goalercn.com/html/article/3879f0b0cf2d5ac95ab6.html
看看MSDN中几种坐标系的转换
定义一个结构
struct LDPoint {
double x;
double y;
};.cpp
//3个主要函数
定义12个基准点给12个点附值
void CColorTestView::EllipeseToBezier(CRect& r ,CPoint* cCtlPt)
{
const double EToBConst = 0.2761423749154;
CSize offset((int)(r.Width()*EToBConst),(int)(r.Height()*EToBConst));
CPoint centre((r.left + r.right)/2 ,(r.top + r.bottom)/2);
cCtlPt[0].x =
cCtlPt[1].x =
cCtlPt[11].x =
cCtlPt[12].x = r.left;
cCtlPt[5].x =
cCtlPt[6].x =
cCtlPt[7].x = r.right;
cCtlPt[2].x =
cCtlPt[10].x = centre.x - offset.cx;
cCtlPt[4].x =
cCtlPt[8].x = centre.x + offset.cx;
cCtlPt[3].x =
cCtlPt[9].x = centre.x;
cCtlPt[2].y =
cCtlPt[3].y =
cCtlPt[4].y = r.top;
cCtlPt[8].y =
cCtlPt[9].y =
cCtlPt[10].y = r.bottom;
cCtlPt[7].y =
cCtlPt[11].y = centre.y + offset.cy;
cCtlPt[1].y =
cCtlPt[5].y = centre.y - offset.cy;
cCtlPt[0].y =
cCtlPt[12].y =
cCtlPt[6].y =centre.y;
}
//按照角度 radians 旋转12个基准点
void CColorTestView::Rotate(double radians,const CPoint& c ,CPoint* vCtrlPt,unsigned Cnt)
{
double sinAng = sin(radians);
double cosAng = cos(radians);
LDPoint constTerm;
constTerm.x = c.x - c.x*cosAng - c.y *sinAng;
constTerm.y = c.y + c.x *sinAng - c.y*cosAng;
for(int i =Cnt -1 ;i>=0;--i)
{
double a = vCtrlPt[i].x*cosAng + vCtrlPt[i].y *sinAng + constTerm.x;
double b = -vCtrlPt[i].x *sinAng + vCtrlPt[i].y*cosAng + constTerm.y;
int a1 = a;
int b1 = b;
vCtrlPt[i] .x = a1;
vCtrlPt[i] .y = b1;
}
}
//点击事件触发绘制有角度的椭圆
void CColorTestView::OnOK()
{
CClientDC dc(this);
CBrush myBrush;
CPoint point[13];
CPoint po(100,100);
myBrush.CreateSolidBrush(RGB(0,0,255));
CRect rect(100,100,200,150);
//定义路径画贝塞尔曲线
dc.BeginPath();
EllipeseToBezier(rect,point);
Rotate(3.14/6,po,point,13);
dc.PolyBezier(point,13);
dc.EndPath(); dc.StrokePath();
}