0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MFCからSVG変換Advent Calendar 2022

Day 5

MFC から SVG の基本図形(2/2)

Last updated at Posted at 2022-12-04

四角形

四角形は 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);
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?