mirror of
https://github.com/UglyToad/PdfPig.git
synced 2026-01-18 19:51:24 +08:00
681 lines
32 KiB
C#
681 lines
32 KiB
C#
namespace UglyToad.PdfPig.Tests.Geometry
|
|
{
|
|
using PdfPig.Core;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UglyToad.PdfPig.Geometry;
|
|
using Xunit;
|
|
|
|
public class PdfPointTests
|
|
{
|
|
private static readonly DoubleComparer DoubleComparer = new DoubleComparer(3);
|
|
private static readonly DoubleComparer PreciseDoubleComparer = new DoubleComparer(6);
|
|
private static readonly PointComparer PointComparer = new PointComparer(DoubleComparer);
|
|
|
|
#region data
|
|
public static IEnumerable<object[]> GrahamScanData => new[]
|
|
{
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(374.54011885, 950.71430641),
|
|
new PdfPoint(731.99394181, 598.6584842),
|
|
new PdfPoint(156.01864044, 155.99452034),
|
|
new PdfPoint(58.08361217, 866.17614577),
|
|
new PdfPoint(601.11501174, 708.0725778),
|
|
new PdfPoint(20.5844943, 969.90985216),
|
|
new PdfPoint(832.4426408, 212.33911068),
|
|
new PdfPoint(181.82496721, 183.40450985),
|
|
new PdfPoint(304.24224296, 524.75643163),
|
|
new PdfPoint(431.94501864, 291.2291402),
|
|
new PdfPoint(611.85289472, 139.49386065),
|
|
new PdfPoint(292.14464854, 366.36184329),
|
|
new PdfPoint(456.06998422, 785.17596139),
|
|
new PdfPoint(199.67378216, 514.23443841),
|
|
new PdfPoint(592.41456886, 46.45041272),
|
|
new PdfPoint(607.5448519, 170.52412369),
|
|
new PdfPoint(65.05159299, 948.88553725),
|
|
new PdfPoint(965.63203307, 808.39734812),
|
|
new PdfPoint(304.61376917, 97.67211401),
|
|
new PdfPoint(684.23302651, 440.15249374)
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(374.54011885, 950.71430641),
|
|
new PdfPoint(156.01864044, 155.99452034),
|
|
new PdfPoint(20.5844943, 969.90985216),
|
|
new PdfPoint(832.4426408, 212.33911068),
|
|
new PdfPoint(592.41456886, 46.45041272),
|
|
new PdfPoint(965.63203307, 808.39734812),
|
|
new PdfPoint(304.61376917, 97.67211401)
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(15.45661653, 928.31856259),
|
|
new PdfPoint(428.18414832, 966.65481904),
|
|
new PdfPoint(963.61997709, 853.00945547)
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(15.45661653, 928.31856259),
|
|
new PdfPoint(428.18414832, 966.65481904),
|
|
new PdfPoint(963.61997709, 853.00945547)
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(511.34239886, 501.51629469),
|
|
new PdfPoint(798.29517897, 649.96393078),
|
|
new PdfPoint(701.96687726, 795.79266944),
|
|
new PdfPoint(890.00534182, 337.99515685),
|
|
new PdfPoint(375.58295264, 93.98193984),
|
|
new PdfPoint(578.280141, 35.9422738),
|
|
new PdfPoint(465.59801813, 542.64463471),
|
|
new PdfPoint(286.54125213, 590.83326057),
|
|
new PdfPoint(30.50024994, 37.34818875),
|
|
new PdfPoint(822.60056066, 360.19064141)
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(798.29517897, 649.96393078),
|
|
new PdfPoint(701.96687726, 795.79266944),
|
|
new PdfPoint(890.00534182, 337.99515685),
|
|
new PdfPoint(578.280141, 35.9422738),
|
|
new PdfPoint(286.54125213, 590.83326057),
|
|
new PdfPoint(30.50024994, 37.34818875)
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(744.3155504888274, 444.2270145755189),
|
|
new PdfPoint(569.808503219366, 795.0780697464061),
|
|
new PdfPoint(979.4238467088927, 747.7769460740175),
|
|
new PdfPoint(263.9656530143659, 534.1164778047929),
|
|
new PdfPoint(700.0199185779105, 59.67088755550021),
|
|
new PdfPoint(350.4405052982569, 201.5075034147189),
|
|
new PdfPoint(951.4434324059339, 276.4851544966993),
|
|
new PdfPoint(221.2620795357345, 889.4493759697666),
|
|
new PdfPoint(26.40411497910822, 836.0708485933704),
|
|
new PdfPoint(967.4534816241033, 692.8854748787957),
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(979.4238467088927, 747.7769460740175),
|
|
new PdfPoint(700.0199185779105, 59.67088755550021),
|
|
new PdfPoint(350.4405052982569, 201.5075034147189),
|
|
new PdfPoint(951.4434324059339, 276.4851544966993),
|
|
new PdfPoint(221.2620795357345, 889.4493759697666),
|
|
new PdfPoint(26.40411497910822, 836.0708485933704),
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(120.21183721137064, 840.2513067067979),
|
|
new PdfPoint(415.52861888639114, 204.0116313873851),
|
|
new PdfPoint(415.9664683980775, 832.443368995516),
|
|
new PdfPoint(277.74879682552734, 502.12519702578516),
|
|
new PdfPoint(395.35090532250103, 384.0997616867551),
|
|
new PdfPoint(26.98104432607229, 654.2675428223525),
|
|
new PdfPoint(507.0471750863688, 822.9947002774292),
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(120.21183721137064, 840.2513067067979),
|
|
new PdfPoint(415.52861888639114, 204.0116313873851),
|
|
new PdfPoint(415.9664683980775, 832.443368995516),
|
|
new PdfPoint(26.98104432607229, 654.2675428223525),
|
|
new PdfPoint(507.0471750863688, 822.9947002774292),
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(101.52924170788602, 157.72180559576165),
|
|
new PdfPoint(89.13969305519842, 437.7399878683488),
|
|
new PdfPoint(963.8109736953475, 34.8258382181843),
|
|
new PdfPoint(323.44164253397423, 760.0469522615875),
|
|
new PdfPoint(553.8798287152455, 601.37868940649),
|
|
new PdfPoint(24.169651959285442, 205.03651103426347),
|
|
new PdfPoint(598.6426557134453, 973.1839362109574),
|
|
new PdfPoint(404.2148279309453, 642.4272597428419),
|
|
new PdfPoint(425.99787946258795, 235.338843056625),
|
|
new PdfPoint(733.837562543066, 304.97834592908157),
|
|
new PdfPoint(253.06825516770635, 639.1969849161718),
|
|
new PdfPoint(702.043917830561, 241.6302720665372),
|
|
new PdfPoint(43.233323888316356, 214.65896998517496),
|
|
new PdfPoint(192.04610854054195, 609.086536570487),
|
|
new PdfPoint(93.436372304046, 130.4501167748684),
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(89.13969305519842, 437.7399878683488),
|
|
new PdfPoint(963.8109736953475, 34.8258382181843),
|
|
new PdfPoint(323.44164253397423, 760.0469522615875),
|
|
new PdfPoint(24.169651959285442, 205.03651103426347),
|
|
new PdfPoint(598.6426557134453, 973.1839362109574),
|
|
new PdfPoint(192.04610854054195, 609.086536570487),
|
|
new PdfPoint(93.436372304046, 130.4501167748684),
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(440.61717693569, 109.0846453611043),
|
|
new PdfPoint(306.3112668458863, 236.31457456363236),
|
|
new PdfPoint(520.2265439015014, 849.1406402603602),
|
|
new PdfPoint(991.7951837792907, 716.5936071305995),
|
|
new PdfPoint(210.02069783227006, 396.9897189605061),
|
|
new PdfPoint(844.0889978638492, 40.8614368982706),
|
|
new PdfPoint(105.18279221346272, 598.2338764791806),
|
|
new PdfPoint(481.07852218200696, 791.2951914667244),
|
|
new PdfPoint(306.45291569755994, 923.936778153581),
|
|
new PdfPoint(959.6247632028106, 131.810977239897),
|
|
new PdfPoint(800.8517955224195, 350.74228914407433),
|
|
new PdfPoint(663.4680772483941, 352.304508375042),
|
|
new PdfPoint(222.58588801803648, 629.9145459539977),
|
|
new PdfPoint(158.01097092542204, 266.66678727838047),
|
|
new PdfPoint(63.28771038884462, 52.73381563522583),
|
|
new PdfPoint(931.6304534780719, 325.3140887623456),
|
|
new PdfPoint(781.7202794605689, 932.8040026798695),
|
|
new PdfPoint(691.9750284379987, 896.4394191971841),
|
|
new PdfPoint(354.5191195854491, 319.9839791539775),
|
|
new PdfPoint(177.99172848582566, 831.9975645935383),
|
|
new PdfPoint(237.7316548429551, 731.2752736686494),
|
|
new PdfPoint(989.397359729622, 217.92540678980444),
|
|
new PdfPoint(509.249200783335, 621.5474147516464),
|
|
new PdfPoint(744.8852601187607, 917.8174495950592),
|
|
new PdfPoint(308.86394317440534, 345.03042856046795),
|
|
new PdfPoint(716.4931552373788, 116.87982985630296),
|
|
new PdfPoint(8.999928995218953, 752.2282844071755),
|
|
new PdfPoint(294.01152638529305, 979.8820875548174),
|
|
new PdfPoint(919.862114089302, 218.09062242740873),
|
|
new PdfPoint(58.10245428844474, 679.4146645720332),
|
|
new PdfPoint(298.5501112825898, 76.27703572384658),
|
|
new PdfPoint(642.7813627195759, 506.9457773647057),
|
|
new PdfPoint(95.40371527671387, 849.060165476576),
|
|
new PdfPoint(462.81907479511983, 59.56530610812505),
|
|
new PdfPoint(883.4162795690498, 4.108824339342565),
|
|
new PdfPoint(255.30517910829244, 890.9400020559517),
|
|
new PdfPoint(127.06302493344879, 246.8462701575741),
|
|
new PdfPoint(995.1831247109899, 371.7538001202371),
|
|
new PdfPoint(189.37270784653683, 888.4231305357099),
|
|
new PdfPoint(924.0107481155084, 775.4673044677166),
|
|
new PdfPoint(865.7452979418968, 373.2043310431542),
|
|
new PdfPoint(409.76929412279594, 192.26266847186992),
|
|
new PdfPoint(438.8872219529338, 819.6826378850956),
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(991.7951837792907, 716.5936071305995),
|
|
new PdfPoint(959.6247632028106, 131.810977239897),
|
|
new PdfPoint(63.28771038884462, 52.73381563522583),
|
|
new PdfPoint(781.7202794605689, 932.8040026798695),
|
|
new PdfPoint(989.397359729622, 217.92540678980444),
|
|
new PdfPoint(8.999928995218953, 752.2282844071755),
|
|
new PdfPoint(294.01152638529305, 979.8820875548174),
|
|
new PdfPoint(95.40371527671387, 849.060165476576),
|
|
new PdfPoint(883.4162795690498, 4.108824339342565),
|
|
new PdfPoint(995.1831247109899, 371.7538001202371),
|
|
}
|
|
}
|
|
};
|
|
|
|
public static IEnumerable<object[]> MinimumAreaRectangleData => new[]
|
|
{
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
// collinear points case: y = 15.7894 + 1.572431x
|
|
new PdfPoint(16, 40.948296),
|
|
new PdfPoint(18, 44.093158),
|
|
new PdfPoint(21, 48.810451),
|
|
new PdfPoint(30, 62.96233),
|
|
new PdfPoint(49, 92.838519),
|
|
new PdfPoint(55, 102.273105),
|
|
new PdfPoint(60, 110.13526),
|
|
new PdfPoint(64, 116.424984),
|
|
new PdfPoint(65, 117.997415),
|
|
new PdfPoint(68, 122.714708),
|
|
new PdfPoint(75, 133.721725),
|
|
new PdfPoint(84, 147.873604),
|
|
new PdfPoint(86, 151.018466),
|
|
new PdfPoint(90, 157.30819),
|
|
new PdfPoint(97, 168.315207),
|
|
new PdfPoint(99, 171.460069),
|
|
new PdfPoint(105, 180.894655),
|
|
new PdfPoint(106, 182.467086),
|
|
new PdfPoint(110, 188.75681),
|
|
new PdfPoint(113, 193.474103),
|
|
new PdfPoint(119, 202.908689),
|
|
new PdfPoint(121, 206.053551),
|
|
new PdfPoint(122, 207.625982),
|
|
new PdfPoint(123, 209.198413)
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(16, 40.948296),
|
|
new PdfPoint(16, 40.948296),
|
|
new PdfPoint(123, 209.198413),
|
|
new PdfPoint(123, 209.198413)
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
// collinear points case: y = 87.483 + 99.2934520998549x
|
|
new PdfPoint(10.5114328889726, 1131.19945806204),
|
|
new PdfPoint(11.1542565096881, 1195.02763445421),
|
|
new PdfPoint(15.3153242359356, 1608.19441341462),
|
|
new PdfPoint(15.795577716642, 1655.88043939693),
|
|
new PdfPoint(16.3319701583886, 1709.14069661821),
|
|
new PdfPoint(17.1302715938114, 1788.40680195762),
|
|
new PdfPoint(17.9770489556469, 1872.48624937427),
|
|
new PdfPoint(22.4037700355884, 2312.03066688486),
|
|
new PdfPoint(23.7647419889928, 2447.16627034947),
|
|
new PdfPoint(26.9327398551415, 2761.72771472434),
|
|
new PdfPoint(28.7600875228236, 2943.17137283512),
|
|
new PdfPoint(32.8221934632313, 3346.51189445353),
|
|
new PdfPoint(34.4943972831614, 3512.55078434895),
|
|
new PdfPoint(34.5363374306664, 3516.7151663763),
|
|
new PdfPoint(36.0282475627216, 3664.85207361081)
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(10.5114328889726, 1131.19945806204),
|
|
new PdfPoint(10.5114328889726, 1131.19945806204),
|
|
new PdfPoint(36.0282475627216, 3664.85207361081),
|
|
new PdfPoint(36.0282475627216, 3664.85207361081)
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
// collinear points case: vertical
|
|
new PdfPoint(446.78, 217.9),
|
|
new PdfPoint(446.78, 228.82),
|
|
new PdfPoint(446.78, 247.52),
|
|
new PdfPoint(446.78, 256.84),
|
|
new PdfPoint(446.78, 301.4),
|
|
new PdfPoint(446.78, 321.39),
|
|
new PdfPoint(446.78, 369.08),
|
|
new PdfPoint(446.78, 387.05),
|
|
new PdfPoint(446.78, 393.22),
|
|
new PdfPoint(446.78, 397.29),
|
|
new PdfPoint(446.78, 463.16),
|
|
new PdfPoint(446.78, 471.88),
|
|
new PdfPoint(446.78, 480.13),
|
|
new PdfPoint(446.78, 495.82),
|
|
new PdfPoint(446.78, 498.99)
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(446.78, 217.9),
|
|
new PdfPoint(446.78, 217.9),
|
|
new PdfPoint(446.78, 498.99),
|
|
new PdfPoint(446.78, 498.99)
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
// collinear points case: horizontal
|
|
new PdfPoint(220, 208.821),
|
|
new PdfPoint(258.92, 208.821),
|
|
new PdfPoint(268.61, 208.821),
|
|
new PdfPoint(283.56, 208.821),
|
|
new PdfPoint(312.49, 208.821),
|
|
new PdfPoint(344.93, 208.821),
|
|
new PdfPoint(356, 208.821),
|
|
new PdfPoint(356.06, 208.821),
|
|
new PdfPoint(366.71, 208.821),
|
|
new PdfPoint(371.07, 208.821),
|
|
new PdfPoint(430.95, 208.821),
|
|
new PdfPoint(445.84, 208.821),
|
|
new PdfPoint(464.95, 208.821),
|
|
new PdfPoint(470.19, 208.821),
|
|
new PdfPoint(498.19, 208.821)
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(220, 208.821),
|
|
new PdfPoint(220, 208.821),
|
|
new PdfPoint(498.19, 208.821),
|
|
new PdfPoint(498.19, 208.821)
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(433.8664544437276, 532.7739491464265),
|
|
new PdfPoint(653.8805470338659, 817.2121262831644),
|
|
new PdfPoint(531.2551432261636, 360.68316491741035),
|
|
new PdfPoint(418.79076902856593, 111.73491145462933),
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(653.880547033866, 817.2121262831644),
|
|
new PdfPoint(461.3184174727883, 100.31182441133716),
|
|
new PdfPoint(327.3696296297328, 136.2909748899142),
|
|
new PdfPoint(519.9317591908105, 853.1912767617414),
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(556.0000554986003, 83.08490003544556),
|
|
new PdfPoint(413.249212383334, 618.580307645359),
|
|
new PdfPoint(526.8827917872168, 111.78528983363456),
|
|
new PdfPoint(220.19687765118178, 377.83114567978316),
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(556.0000554986004, 83.08490003544566),
|
|
new PdfPoint(315.83633925060445, 19.06273944752293),
|
|
new PdfPoint(173.0854961353382, 554.5581470574363),
|
|
new PdfPoint(413.24921238333417, 618.580307645359),
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(14.004896521066401, 809.4941990011544),
|
|
new PdfPoint(703.95616092419, 970.7474069029789),
|
|
new PdfPoint(835.551079058811, 661.2654117428186),
|
|
new PdfPoint(200.4833132016346, 14.581989889114745),
|
|
new PdfPoint(73.40355670360321, 345.2226372321663),
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(945.970699704068, 188.81492303383516),
|
|
new PdfPoint(153.25937285270737, 3.544961240987477),
|
|
new PdfPoint(-32.56092111592515, 798.6109846932103),
|
|
new PdfPoint(760.1504057354355, 983.8809464860581),
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
// duplicate points case
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(14.004896521066401, 809.4941990011544),
|
|
new PdfPoint(703.95616092419, 970.7474069029789),
|
|
new PdfPoint(835.551079058811, 661.2654117428186),
|
|
new PdfPoint(703.95616092419, 970.7474069029789),
|
|
new PdfPoint(703.95616092419, 970.7474069029789),
|
|
new PdfPoint(200.4833132016346, 14.581989889114745),
|
|
new PdfPoint(200.4833132016346, 14.581989889114745),
|
|
new PdfPoint(73.40355670360321, 345.2226372321663),
|
|
new PdfPoint(73.40355670360321, 345.2226372321663),
|
|
new PdfPoint(73.40355670360321, 345.2226372321663),
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(945.970699704068, 188.81492303383516),
|
|
new PdfPoint(153.25937285270737, 3.544961240987477),
|
|
new PdfPoint(-32.56092111592515, 798.6109846932103),
|
|
new PdfPoint(760.1504057354355, 983.8809464860581),
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(737.1041856902102, 648.0900313433699),
|
|
new PdfPoint(258.83885597639045, 32.15501719959235),
|
|
new PdfPoint(354.5500618726748, 908.7838113897652),
|
|
new PdfPoint(867.6475306924474, 47.361938752654595),
|
|
new PdfPoint(352.7960490248145, 283.67860449564785),
|
|
new PdfPoint(955.4087841797756, 833.327418435315),
|
|
new PdfPoint(578.2403790703082, 67.4511148622331),
|
|
new PdfPoint(722.9995401934759, 407.36102955779796),
|
|
new PdfPoint(404.3710508165602, 736.1127320695537),
|
|
new PdfPoint(56.25949705397548, 45.503737933916824),
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(956.3312379371301, 841.5886588013605),
|
|
new PdfPoint(857.4507470077488, -43.95763180386355),
|
|
new PdfPoint(56.25949705397548, 45.503737933916824),
|
|
new PdfPoint(155.13998798335692, 931.0500285391407),
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(37.79696601832361, 984.5348223984452),
|
|
new PdfPoint(881.8169100214427, 818.3604232045343),
|
|
new PdfPoint(732.8834668881201, 907.4453370173243),
|
|
new PdfPoint(142.89010125285918, 183.62301422208304),
|
|
new PdfPoint(292.4319539617013, 383.1685740348906),
|
|
new PdfPoint(658.9302664366852, 781.9569855570855),
|
|
new PdfPoint(501.7748878713084, 321.0551716869758),
|
|
new PdfPoint(104.96397346166219, 658.8420562657931),
|
|
new PdfPoint(931.1420702804029, 235.94015835854032),
|
|
new PdfPoint(489.5915692144058, 835.989512769871),
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(931.1420702804029, 235.9401583585403),
|
|
new PdfPoint(91.18213738971586, 180.19110018351975),
|
|
new PdfPoint(37.79696601832373, 984.5348223984452),
|
|
new PdfPoint(877.7568989090107, 1040.2838805734657),
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(360.50496116131137, 475.0257075944493),
|
|
new PdfPoint(463.6183053562707, 550.6502767074434),
|
|
new PdfPoint(719.7530742800635, 986.4011287537438),
|
|
new PdfPoint(746.9948030700444, 387.8044519192034),
|
|
new PdfPoint(868.5846874204865, 248.33194807842352),
|
|
new PdfPoint(485.3109455640756, 39.94793327837021),
|
|
new PdfPoint(504.8344865133781, 708.8088010613369),
|
|
new PdfPoint(352.0102119724019, 820.2239288583693),
|
|
new PdfPoint(28.306241810454267, 579.9713087166957),
|
|
new PdfPoint(801.671925406638, 886.8351079919669),
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(1131.0092157743165, 443.1030548242194),
|
|
new PdfPoint(485.483254766563, -36.005383122939776),
|
|
new PdfPoint(28.306241810454186, 579.9713087166958),
|
|
new PdfPoint(673.8322028182079, 1059.079746663855),
|
|
}
|
|
},
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(384.5196462100093, 457.53938224300975),
|
|
new PdfPoint(388.62152246674617, 197.75832374394065),
|
|
new PdfPoint(40.7654267847265, 320.51104165848284),
|
|
new PdfPoint(443.45264559634137, 22.11792681360786),
|
|
new PdfPoint(345.74164027022573, 484.01784165724456),
|
|
new PdfPoint(453.33094307272717, 441.7802101118389),
|
|
new PdfPoint(470.9897811308254, 63.67713677117809),
|
|
new PdfPoint(277.98105707671505, 321.72593673466497),
|
|
new PdfPoint(447.8012370058249, 358.25102431521026),
|
|
new PdfPoint(345.94253780510235, 111.25057954480089),
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(647.6991334648283, 297.75247084308063),
|
|
new PdfPoint(443.4526455963414, 22.117926813607856),
|
|
new PdfPoint(40.7654267847265, 320.5110416584829),
|
|
new PdfPoint(245.0119146532134, 596.1455856879556),
|
|
}
|
|
}
|
|
};
|
|
|
|
public static IEnumerable<object[]> Issue458Data => new[]
|
|
{
|
|
new object[]
|
|
{
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(134.74199999999985, 1611.657),
|
|
new PdfPoint(277.58043749999985, 1611.657),
|
|
new PdfPoint(314.74199999999985, 1611.657),
|
|
new PdfPoint(507.0248828124999, 1611.657),
|
|
new PdfPoint(545.1419999999998, 1611.657),
|
|
new PdfPoint(632.9658281249997, 1611.657),
|
|
new PdfPoint(668.5709999999998, 1611.657),
|
|
new PdfPoint(831.3395078125002, 1611.657),
|
|
new PdfPoint(868.1139999999998, 1611.657),
|
|
new PdfPoint(892.8907187499999, 1611.657),
|
|
new PdfPoint(1010.0569999999999, 1611.6569999999997),
|
|
new PdfPoint(1046.2174003906248, 1611.7654812011715),
|
|
new PdfPoint(1010.0569999999999, 1611.657),
|
|
new PdfPoint(1046.2174003906248, 1611.7654812011717),
|
|
new PdfPoint(1085.145, 1611.8822639999996),
|
|
new PdfPoint(1255.484941406251, 1612.3932838242179),
|
|
new PdfPoint(1301.144, 1612.5302609999994),
|
|
new PdfPoint(1359.0006406250002, 1612.7038309218747),
|
|
new PdfPoint(1301.144, 1612.5302609999997),
|
|
new PdfPoint(1359.0006406250002, 1612.703830921875),
|
|
new PdfPoint(1400.915, 1612.8295739999996),
|
|
new PdfPoint(1505.379062499999, 1613.1429661874993),
|
|
new PdfPoint(1400.915, 1612.8295739999999),
|
|
new PdfPoint(1505.379062499999, 1613.1429661874995),
|
|
new PdfPoint(1543.886, 1613.2584869999996),
|
|
new PdfPoint(1600.9401015625003, 1613.4296493046872),
|
|
new PdfPoint(1641.597, 1613.5516199999997),
|
|
new PdfPoint(1764.5577421874998, 1613.9205022265612),
|
|
new PdfPoint(1641.597, 1613.55162),
|
|
new PdfPoint(1764.5577421874998, 1613.9205022265614)
|
|
},
|
|
new PdfPoint[]
|
|
{
|
|
new PdfPoint(134.74199999999985, 1611.657),
|
|
new PdfPoint(1010.0569999999999, 1611.6569999999997),
|
|
new PdfPoint(1764.5577421874998, 1613.9205022265614),
|
|
}
|
|
}
|
|
};
|
|
#endregion
|
|
|
|
[Fact]
|
|
public void OriginIsZero()
|
|
{
|
|
var origin = PdfPoint.Origin;
|
|
|
|
Assert.Equal(0, origin.X);
|
|
Assert.Equal(0, origin.Y);
|
|
}
|
|
|
|
[Fact]
|
|
public void IntsSetValue()
|
|
{
|
|
var origin = new PdfPoint(256, 372);
|
|
|
|
Assert.Equal(256, origin.X);
|
|
Assert.Equal(372, origin.Y);
|
|
}
|
|
|
|
[Fact]
|
|
public void DoublesSetValue()
|
|
{
|
|
var origin = new PdfPoint(0.534436, 0.32552);
|
|
|
|
Assert.Equal(0.534436, origin.X);
|
|
Assert.Equal(0.32552, origin.Y);
|
|
}
|
|
|
|
[Theory]
|
|
[MemberData(nameof(GrahamScanData))]
|
|
public void GrahamScan(PdfPoint[] points, PdfPoint[] expected)
|
|
{
|
|
expected = expected.OrderBy(p => p.X).ThenBy(p => p.Y).ToArray();
|
|
var convexHull = GeometryExtensions.GrahamScan(points).OrderBy(p => p.X).ThenBy(p => p.Y).ToArray();
|
|
|
|
for (var i = 0; i < expected.Length; i++)
|
|
{
|
|
Assert.Equal(expected[i], convexHull[i], PointComparer);
|
|
}
|
|
}
|
|
|
|
[Theory]
|
|
[MemberData(nameof(MinimumAreaRectangleData))]
|
|
public void MinimumAreaRectangle(PdfPoint[] points, PdfPoint[] expected)
|
|
{
|
|
expected = expected.OrderBy(p => p.X).ThenBy(p => p.Y).ToArray();
|
|
|
|
var marRectangle = GeometryExtensions.MinimumAreaRectangle(points);
|
|
var mar = new[] { marRectangle.BottomLeft, marRectangle.BottomRight, marRectangle.TopLeft, marRectangle.TopRight }.OrderBy(p => p.X).ThenBy(p => p.Y).ToArray();
|
|
|
|
for (var i = 0; i < expected.Length; i++)
|
|
{
|
|
Assert.Equal(expected[i], mar[i], PointComparer);
|
|
}
|
|
}
|
|
|
|
[Theory]
|
|
[MemberData(nameof(Issue458Data))]
|
|
public void Issue458(PdfPoint[] points, PdfPoint[] expected)
|
|
{
|
|
/*
|
|
* https://github.com/UglyToad/PdfPig/issues/458
|
|
* An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in System.Linq.dll: 'Specified argument was out of the range of valid values.'
|
|
* at System.Linq.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument)
|
|
* at System.Linq.Enumerable.ElementAt[TSource](IEnumerable`1 source, Int32 index)
|
|
*/
|
|
|
|
var result = GeometryExtensions.GrahamScan(points);
|
|
|
|
// Data is noisy so we just check it does not throw an exception
|
|
// and that key points are present (other points might be present,
|
|
// e.g. 'not enough equal dupplicates' or 'not collinear enough' points)
|
|
foreach (var point in expected)
|
|
{
|
|
Assert.Contains(point, result);
|
|
}
|
|
}
|
|
|
|
[Theory]
|
|
[MemberData(nameof(Issue458Data))]
|
|
public void Issue458_Inv(PdfPoint[] points, PdfPoint[] expected)
|
|
{
|
|
/*
|
|
* https://github.com/UglyToad/PdfPig/issues/458
|
|
* An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in System.Linq.dll: 'Specified argument was out of the range of valid values.'
|
|
* at System.Linq.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument)
|
|
* at System.Linq.Enumerable.ElementAt[TSource](IEnumerable`1 source, Int32 index)
|
|
*/
|
|
var pointsInv = points.Select(p => new PdfPoint(p.Y, p.X)).ToArray();
|
|
var expectedInv = expected.Select(p => new PdfPoint(p.Y, p.X)).ToArray();
|
|
|
|
var result = GeometryExtensions.GrahamScan(pointsInv);
|
|
|
|
// Data is noisy so we just check it does not throw an exception
|
|
// and that key points are present (other points might be present,
|
|
// e.g. 'not enough equal dupplicates' or 'not collinear enough' points)
|
|
foreach (var point in expectedInv)
|
|
{
|
|
Assert.Contains(point, result);
|
|
}
|
|
}
|
|
}
|
|
}
|