高级会员
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
|
【转帖】some Arcs Render Backwards
some arcs render backwards
some arcs render backwards
i am reading dwg files in and drawing a simplified representation in a windows screen using:
bool anglearc( int x, int y, int nradius,
float fstartangle, float fsweepangle );
given center points in m_apoints[0]->m_x, m_apoints[0]->m_y, radius in m_dradius, m_fstartangle and m_fendangle, the following routine executes. the problem is that about half the arcs are drawn correctly and half are drawn backwards. it seems as though the start and end pionts are swapped. this routine is exactly the same as the routine used with opendwg, however opendwg has no problem drawing all the arcs correctly.
does anyone have any ideas?
thanks
al
[snippet]
float fstartx = cos(m_fstartangle)*m_dradius + m_apoints[0]->m_x;
float fstarty = sin(m_fstartangle+3.141592654)*m_dradius +
m_apoints[0]->m_y;
float fnewstartx = m_pparentdata->acadxtownd(fstartx);
float fnewstarty = m_pparentdata->acadytownd(fstarty);
float fcenterx = m_pparentdata->acadxtownd(m_apoints[0]->m_x);
float fcentery = m_pparentdata->acadytownd(m_apoints[0]->m_y);
fnewstartx -= fcenterx;
fnewstarty -= fcentery;
float fradius = sqrt( (fnewstartx*fnewstartx) +
(fnewstarty*fnewstarty) );
float fx = fcenterx + (cos(m_fstartangle)*fradius);
float fy = fcentery + (sin(m_fstartangle+3.141592654)*fradius);
pdc->moveto( fx, fy );
pdc->anglearc( fcenterx, fcentery,
fradius, radtodeg(m_fstartangle),
radtodeg(m_fendangle-m_fstartangle) );
i'm not sure which dwgdirect classes you are using but maybe this would help:
oddbarc is always counter-clockwise and end angle must be greater than start angle. arc's normal must be taken into account even if the arc is in xy plane. normal (0,0,1) and (0,0,-1) will produce different results because angles are measured from ocs x-axis around ocs z-axis which coincides with normal.
sergey slezkin
with help from sergey and i have solved my problem with the following:
if (m_fstartangle > m_fendangle)
m_fendangle = m_fendangle + ((360 * 3.141592654) / 180);
this "un-normalized" the end angle when it is less then the start angle. the end angle was "normalized" by dwgdirect because when read form the dwg file it calculated to greater then 360 degrees.
thanks for the help.
|