我用Arc函数画了一段弧,我想直接得到这段弧的两个端点坐标,在windows下好像没有这样的函数,难道需要自己计算吗?
请问,如果需要自己算,怎么算呢?
请问,如果需要自己算,怎么算呢?
解决方案 »
- vc6.0 bcgcontrolbar12不能使用office2007界面
- VC 6.0 combobox 不显示选项
- ===== recv() 函数 =====
- 我写了个DLL(Win32),老是出错,高手帮忙看一下啊!!
- 'IHTMLControlElement' : redefinition; different uuid specifiers 错误的解决办法?
- 字体(font)是什么,字符集(charcode)有是什么?他们之间的关系是什么??
- ***足球网文***
- 为什么我回复不了了?而起我参与的问题也看不了?
- ***当HOOK住某个游戏的DirectDrawCreateEx调用后,接下来如何往他的屏幕上写东西***
- 网络编程高手请进来
- 如何把子表信息写入总表
- 不爽得很呀~,我要散分呀,为什么你们不来接,为什么?~
The Arc function draws an elliptical arc. BOOL Arc(
HDC hdc, // handle to device context
int nLeftRect, // x-coord of rectangle's upper-left corner
int nTopRect, // y-coord of rectangle's upper-left corner
int nRightRect, // x-coord of rectangle's lower-right corner
int nBottomRect, // y-coord of rectangle's lower-right corner
int nXStartArc, // x-coord of first radial ending point
int nYStartArc, // y-coord of first radial ending point
int nXEndArc, // x-coord of second radial ending point
int nYEndArc // y-coord of second radial ending point
);因此,你要用Arc画一段弧,肯定先要知道2个端点的坐标啊!!
你用下面的代码画一下就知道了,arc函数中的后两个点不是弧的端点坐标。
弧的中心点向由这两个点构成的直线引的射线构成的弧 pDC->Rectangle(100,100,300,300);
pDC->Ellipse(200-2, 200-2, 200+2, 200+2); pDC->Arc(100,100,300,300,277,111,245,298);
pDC->MoveTo(277,111);
pDC->LineTo(245,298); CPen pen(PS_SOLID,0, RGB(255,0,0));
CPen* OldPen = pDC->SelectObject(&pen);
pDC->MoveTo(200,200);
pDC->LineTo(277,111);
pDC->MoveTo(200,200);
pDC->LineTo(245,298);
pDC->SelectObject(OldPen);
r = (a * b) / sqrt(cos(A)*cos(A)*b*b + sin(A)*sin(A)*a*a);
其中
a,b是椭圆长短轴,(这个是已知吧?)
角度A是就是你说的射线的角度,(那么cos(A)和sin(A)也已知了)
r就是你说的中心点到弧端点的长度,
那么端点坐标就好求了吧。(注意坐标转换!)
原来还需要自己算呀,我还想着有现成的函数呢。
我按照公式算了一下,可以,谢谢函数如下:
#include <math.h>
#define PI 3.1415926//得到弧的角度
double GetArcAngle(LPCRECT lpRect, POINT pt)
{
long a = abs((lpRect->right-lpRect->left)/2);
long b = abs((lpRect->bottom-lpRect->top)/2); double tanval = 0;
double angle = 0;
tanval = (((lpRect->top+b)-pt.y)*1.0) / ((pt.x-(lpRect->left+a))*1.0) ;
angle = atan(tanval); return angle;}//根据角度得到弧的端点坐标
POINT GetArcPoint(LPCRECT lpRect, double angle)
{
long a = abs((lpRect->right-lpRect->left)/2);
long b = abs((lpRect->bottom-lpRect->top)/2);
double radio; POINT pt; radio = (a*b)*1.0 / sqrt( (sin(angle)*sin(angle))*(a*a) + (cos(angle)*cos(angle))*(b*b) ) ; long dx,dy;
dx = (long)(radio*cos(angle));
dy = (long)(radio*sin(angle)); pt.x = lpRect->left+a + dx;
pt.y = lpRect->top+b - dy; return pt;
}测试代码:
CRect rect(100, 100, 400, 200);
POINT pt1;
pt1.x = 377;
pt1.y = 111; POINT pt2;
pt2.x = 465;
pt2.y = 328; long cx;
long cy;
cx = rect.left+ (rect.right-rect.left)/2;
cy = rect.top + (rect.bottom-rect.top)/2; pDC->Rectangle(rect);
pDC->Ellipse(cx-2, cy-2, cx+2, cy+2); pDC->Arc(&rect, pt1, pt2);
pDC->MoveTo(pt1);
pDC->LineTo(pt2); CPen* OldPen;
CPen pen1(PS_SOLID,0, RGB(255,0,0));
OldPen = pDC->SelectObject(&pen1);
pDC->MoveTo(cx,cy);
pDC->LineTo(pt1);
pDC->MoveTo(cx,cy);
pDC->LineTo(pt2);
pDC->SelectObject(OldPen); double angle1;
double angle2; angle1 = GetArcAngle(&rect, pt1);
pt1 = GetArcPoint(&rect, angle1);
angle2 = GetArcAngle(&rect, pt2);
pt2 = GetArcPoint(&rect, angle2); CPen pen(PS_SOLID,0, RGB(255,0,255));
OldPen = pDC->SelectObject(&pen);
pDC->MoveTo(pt1);
pDC->LineTo(pt2);
pDC->SelectObject(OldPen);
x = a * cosA
y = b * sinA
A的角度可以根据,nXStart,nYStart和包围矩形中心成的角度来计算
这个角度可以是atan2(dx,dy)函数自己算得到
应该用 atan2否则在x的负半轴上计算就会出现错误的