From 1a1c8e71fcd14858f595029f089b2d4a00202b32 Mon Sep 17 00:00:00 2001
From: ogi <Administrator@S-OGI-PC>
Date: Fri, 05 Dec 2025 09:24:16 +0900
Subject: [PATCH] プロジェクトファイルを追加。
---
HotelPms.Share.Windows/GraphicsApi/Geometry.cs | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 119 insertions(+), 0 deletions(-)
diff --git a/HotelPms.Share.Windows/GraphicsApi/Geometry.cs b/HotelPms.Share.Windows/GraphicsApi/Geometry.cs
new file mode 100644
index 0000000..6ba49f1
--- /dev/null
+++ b/HotelPms.Share.Windows/GraphicsApi/Geometry.cs
@@ -0,0 +1,119 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HotelPms.Share.Windows.GraphicsApi
+{
+ public class Geometry
+ {
+ /// <summary>
+ /// 任意二点の距離
+ /// </summary>
+ /// <param name="coord1"></param>
+ /// <param name="coord2"></param>
+ /// <returns></returns>
+ public static double Dist2d(PointD coord1, PointD coord2)
+ {
+ double dx = coord1.X - coord2.X;
+ double dy = coord1.Y - coord2.Y;
+ return Math.Sqrt(dx * dx + dy * dy);
+ }
+
+ /// <summary>
+ /// 二点同じ?
+ /// </summary>
+ /// <param name="coord1"></param>
+ /// <param name="coord2"></param>
+ /// <returns></returns>
+ public static bool Equals(PointD coord1, PointD coord2)
+ {
+ return coord1.X == coord2.X && coord1.Y == coord2.Y;
+ }
+
+ /// <summary>
+ /// 平行移動
+ /// </summary>
+ /// <param name="coords"></param>
+ /// <param name="offset"></param>
+ /// <returns></returns>
+ public static IList<PointD> OffsetCoords(IList<PointD> coords, double offset)
+ {
+ var path = new List<PointD>();
+ int N = coords.Count - 1;
+ int max = N;
+ double mi, mi1, li, li1, ri, ri1, si, si1, Xi1, Yi1;
+ PointD p0, p1, p2;
+
+ var isClosed = Equals(coords[0], coords[N]);
+ if (!isClosed)
+ {
+ p0 = coords[0];
+ p1 = coords[1];
+
+ double qq1 = Dist2d(p0, p1);
+ double qq2 = (p1.Y - p0.Y);
+ double qq3 = qq2 / qq1;
+ double qq4 = qq3 * offset;
+ double qq5 = p0.X + qq4;
+
+ p2 = new PointD(p0.X + (p1.Y - p0.Y) / Dist2d(p0, p1) * offset, p0.Y - (p1.X - p0.X) / Dist2d(p0, p1) * offset);
+ path.Add(p2);
+ coords.Add(coords[N].Clone());
+ N++;
+ max--;
+ }
+
+ for (var i = 0; i < max; i++)
+ {
+ p0 = coords[i];
+ p1 = coords[(i + 1) % N];
+ p2 = coords[(i + 2) % N];
+ mi = (p1.Y - p0.Y) / (p1.X - p0.X);
+ mi1 = (p2.Y - p1.Y) / (p2.X - p1.X);
+
+ // Prevent alignements
+ if (Math.Abs(mi - mi1) > 1e-10) //0.0000000001
+ {
+ li = Math.Sqrt((p1.X - p0.X) * (p1.X - p0.X) + (p1.Y - p0.Y) * (p1.Y - p0.Y));
+ li1 = Math.Sqrt((p2.X - p1.X) * (p2.X - p1.X) + (p2.Y - p1.Y) * (p2.Y - p1.Y));
+ ri = p0.X + offset * (p1.Y - p0.Y) / li;
+ ri1 = p1.X + offset * (p2.Y - p1.Y) / li1;
+ si = p0.Y - offset * (p1.X - p0.X) / li;
+ si1 = p1.Y - offset * (p2.X - p1.X) / li1;
+ Xi1 = (mi1 * ri1 - mi * ri + si - si1) / (mi1 - mi);
+ Yi1 = (mi * mi1 * (ri1 - ri) + mi1 * si - mi * si1) / (mi1 - mi);
+
+ // Correction for vertical lines
+ if (p1.X - p0.X == 0)
+ {
+ Xi1 = p1.X + offset * (p1.Y - p0.Y) / Math.Abs(p1.Y - p0.Y);
+ Yi1 = mi1 * Xi1 - mi1 * ri1 + si1;
+ }
+ if (p2.X - p1.X == 0)
+ {
+ Xi1 = p2.X + offset * (p2.Y - p1.Y) / Math.Abs(p2.Y - p1.Y);
+ Yi1 = mi * Xi1 - mi * ri + si;
+ }
+ path.Add(new PointD(Xi1, Yi1));
+ }
+ }
+
+ if (isClosed)
+ {
+ path.Add(path[0].Clone());
+ }
+ else
+ {
+ coords.RemoveAt(coords.Count - 1);
+ p0 = coords[coords.Count - 1];
+ p1 = coords[coords.Count - 2];
+ p2 = new PointD(p0.X - (p1.Y - p0.Y) / Dist2d(p0, p1) * offset, p0.Y + (p1.X - p0.X) / Dist2d(p0, p1) * offset);
+ path.Add(p2);
+ }
+ return path;
+ }
+ }
+}
--
Gitblit v1.10.0