四角形
四角形は MFC も SVG も描画開始点と横幅、縦幅を指定して描画します。
SVG では角の円い四角形は rect の属性値 rx, ry を指定すれば描画できます。
MFC で描く場合はパスを利用することになりますが SVG の出力で簡単に描けてしまいますので追加する関数では角の径を指定するようにしておきます。
SvgImage.h
class SvgImage
{
public:
+ void AddRect(double dX, double dY, double dWidth, double dHeight,
+ double dRx, double dRy, int nDepth = 0);
}
SvgImage.cpp
void SvgImage::AddRect(double dX, double dY, double dWidth, double dHeight,
double dRx, double dRy, int nDepth)
{
SvgTag *svgPath = new SvgTag();
svgPath->m_strName = L"rect";
svgPath->m_nDepth = nDepth + 1;
svgPath->m_bOne = TRUE;
mdPoint point;
CString csStr;
csStr.Format(_T("%lf"), dX - m_rectAll.left);
svgPath->m_arrAttr.Add(L"x");
svgPath->m_arrAttrValue.Add(csStr);
csStr.Format(_T("%lf"), m_rectAll.bottom - dY);
svgPath->m_arrAttr.Add(L"y");
svgPath->m_arrAttrValue.Add(csStr);
csStr.Format(_T("%lf"), dWidth);
svgPath->m_arrAttr.Add(L"width");
svgPath->m_arrAttrValue.Add(csStr);
csStr.Format(_T("%lf"), dHeight);
svgPath->m_arrAttr.Add(L"height");
svgPath->m_arrAttrValue.Add(csStr);
// 角の径は負の値をとらない
if ((dRx > 0) || (dRy > 0))
{
dRx = !(dRx > 0) ? dRy : dRx;
dRy = !(dRy > 0) ? dRx : dRy;
csStr.Format(_T("%lf"), dRx);
svgPath->m_arrAttr.Add(L"rx");
svgPath->m_arrAttrValue.Add(csStr);
csStr.Format(_T("%lf"), dRy);
svgPath->m_arrAttr.Add(L"ry");
svgPath->m_arrAttrValue.Add(csStr);
}
m_arrayTag.Add(svgPath);
}
円、楕円
MFC で円や楕円を描く場合、四角形の頂点を指定し、その内側いっぱいに円が描画されます。
SVG で楕円を描く場合、中心点の座標と X 方向の径と Y 方向の径が必要になります。
四角形と同じく、楕円も SVG の描き方に合わせた関数にします。
SvgImage.h
class SvgImage
{
public:
+ void AddEllipse(double dCx, double dCy, double dRx, double dRy, int nDepth = 0);
}
SvgImage.cpp
void SvgImage::AddEllipse(double dCx, double dCy, double dRx, double dRy, int nDepth)
{
SvgTag *svgPath = new SvgTag();
svgPath->m_strName = L"ellipse";
svgPath->m_nDepth = nDepth + 1;
svgPath->m_bOne = TRUE;
CString csStr;
csStr.Format(_T("%lf"), dCx - m_rectAll.left);
svgPath->m_arrAttr.Add(L"cx");
svgPath->m_arrAttrValue.Add(csStr);
csStr.Format(_T("%lf"), m_rectAll.bottom - dCy);
svgPath->m_arrAttr.Add(L"cy");
svgPath->m_arrAttrValue.Add(csStr);
// 径は負の値をとらない
if ((dRx > 0) || (dRy > 0))
{
csStr.Format(_T("%lf"), dRx);
svgPath->m_arrAttr.Add(L"rx");
svgPath->m_arrAttrValue.Add(csStr);
csStr.Format(_T("%lf"), dRy);
svgPath->m_arrAttr.Add(L"ry");
svgPath->m_arrAttrValue.Add(csStr);
}
m_arrayTag.Add(svgPath);
}