@orbat-mapper/control-measures 0.2.0-alpha.7 → 0.2.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -3
- package/dist/{index-DUGzYzPy.d.mts → index-BHWESyWA.d.mts} +23 -17
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/preview/index.d.mts +1 -1
- package/dist/preview/index.mjs +1 -1
- package/dist/{renderControlMeasure-DGWf44sn.mjs → renderControlMeasure-DnM2w9jS.mjs} +88 -88
- package/media/battle-position.svg +1 -1
- package/media/circle.svg +1 -0
- package/media/encirclement.svg +1 -0
- package/media/line.svg +1 -0
- package/media/polygon.svg +1 -0
- package/media/rectangle.svg +1 -0
- package/media/strong-point.svg +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -75,8 +75,8 @@ controls how invalid coordinate input is handled:
|
|
|
75
75
|
|
|
76
76
|
- `validationMode: "silent" | "warn" | "throw"`
|
|
77
77
|
|
|
78
|
-
When omitted, validation
|
|
79
|
-
useful for strict integrations and tests.
|
|
78
|
+
When omitted, validation defaults to `silent` mode — invalid input yields an
|
|
79
|
+
empty render. `"throw"` is useful for strict integrations and tests.
|
|
80
80
|
|
|
81
81
|
## Supported control measures
|
|
82
82
|
|
|
@@ -107,10 +107,12 @@ code.
|
|
|
107
107
|
| --- | --- | --- | --- |
|
|
108
108
|
| <img src="media/fortified-area.svg" width="96" height="48" alt=""> | `fortified-area` | Fortified Area | `151000` |
|
|
109
109
|
| <img src="media/battle-position.svg" width="96" height="48" alt=""> | `battle-position` | Battle Position | `151200` |
|
|
110
|
+
| <img src="media/strong-point.svg" width="96" height="48" alt=""> | `strong-point` | Strong Point | `151203` |
|
|
110
111
|
| <img src="media/airborne-attack.svg" width="96" height="48" alt=""> | `airborne-attack` | Airborne Attack | `151401` |
|
|
111
112
|
| <img src="media/attack-helicopter.svg" width="96" height="48" alt=""> | `attack-helicopter` | Attack Helicopter | `151402` |
|
|
112
113
|
| <img src="media/main-attack.svg" width="96" height="48" alt=""> | `main-attack` | Main Attack | `151403` |
|
|
113
114
|
| <img src="media/supporting-attack.svg" width="96" height="48" alt=""> | `supporting-attack` | Supporting Attack | `151404` |
|
|
115
|
+
| <img src="media/encirclement.svg" width="96" height="48" alt=""> | `encirclement` | Encirclement | `151800` |
|
|
114
116
|
| <img src="media/attack-by-fire.svg" width="96" height="48" alt=""> | `attack-by-fire` | Attack by Fire | `152000` |
|
|
115
117
|
| <img src="media/support-by-fire.svg" width="96" height="48" alt=""> | `support-by-fire` | Support By Fire | `152100` |
|
|
116
118
|
| <img src="media/search-area.svg" width="96" height="48" alt=""> | `search-area` | Search Area | `152200` |
|
|
@@ -148,12 +150,16 @@ code.
|
|
|
148
150
|
| <img src="media/delay.svg" width="96" height="48" alt=""> | `delay` | Delay | `340800` |
|
|
149
151
|
| <img src="media/isolate.svg" width="96" height="48" alt=""> | `isolate` | Isolate | `341500` |
|
|
150
152
|
|
|
151
|
-
### Generic
|
|
153
|
+
### Generic Graphics
|
|
152
154
|
|
|
153
155
|
| Preview | `kind` | Measure | 2525E Value |
|
|
154
156
|
| --- | --- | --- | --- |
|
|
155
157
|
| <img src="media/block-arrow.svg" width="96" height="48" alt=""> | `block-arrow` | Block Arrow | `990001` |
|
|
156
158
|
| <img src="media/classic-arrow.svg" width="96" height="48" alt=""> | `classic-arrow` | Classic Arrow | `990002` |
|
|
159
|
+
| <img src="media/line.svg" width="96" height="48" alt=""> | `line` | Line | `990101` |
|
|
160
|
+
| <img src="media/polygon.svg" width="96" height="48" alt=""> | `polygon` | Polygon | `990102` |
|
|
161
|
+
| <img src="media/rectangle.svg" width="96" height="48" alt=""> | `rectangle` | Rectangle | `990103` |
|
|
162
|
+
| <img src="media/circle.svg" width="96" height="48" alt=""> | `circle` | Circle | `990104` |
|
|
157
163
|
|
|
158
164
|
<!-- /AUTO-GENERATED:measures-table -->
|
|
159
165
|
|
|
@@ -292,6 +292,8 @@ interface BoundaryOptions {
|
|
|
292
292
|
*/
|
|
293
293
|
smoothResolution?: number;
|
|
294
294
|
}
|
|
295
|
+
/** Default options for the Boundary control measure. */
|
|
296
|
+
declare const DEFAULT_BOUNDARY_OPTIONS: BoundaryOptions;
|
|
295
297
|
/**
|
|
296
298
|
* Creates a Boundary control measure: a polyline through `positions` carrying
|
|
297
299
|
* repeated echelon + unit-designator labels.
|
|
@@ -378,6 +380,8 @@ interface BattlePositionOptions {
|
|
|
378
380
|
*/
|
|
379
381
|
smoothResolution?: number;
|
|
380
382
|
}
|
|
383
|
+
/** Default options for the Battle Position control measure. */
|
|
384
|
+
declare const DEFAULT_BATTLE_POSITION_OPTIONS: BattlePositionOptions;
|
|
381
385
|
/**
|
|
382
386
|
* Creates a Battle Position control measure: a closed area through `positions`
|
|
383
387
|
* carrying a single echelon (Field B) glyph straddling its boundary — anchored
|
|
@@ -447,7 +451,7 @@ interface FinalProtectiveFireOptions {
|
|
|
447
451
|
* Blade height (its perpendicular reach into the inside of the V) relative
|
|
448
452
|
* to the bladed arm's own length (default: 0.03).
|
|
449
453
|
*/
|
|
450
|
-
|
|
454
|
+
bladeHeightRatio?: number;
|
|
451
455
|
}
|
|
452
456
|
declare const DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS: Required<FinalProtectiveFireOptions>;
|
|
453
457
|
type FpfProps = {
|
|
@@ -512,8 +516,8 @@ declare const unproject: (x: number, y: number) => Position;
|
|
|
512
516
|
//#region src/attack-utils.d.ts
|
|
513
517
|
interface AttackOptions {
|
|
514
518
|
shaftWidthRatio?: number;
|
|
515
|
-
|
|
516
|
-
|
|
519
|
+
smooth?: boolean;
|
|
520
|
+
smoothResolution?: number;
|
|
517
521
|
}
|
|
518
522
|
/**
|
|
519
523
|
* Calculates the relative metrics (longitudinal and lateral) of the width point
|
|
@@ -607,6 +611,7 @@ interface ClassicArrowOptions {
|
|
|
607
611
|
/** Arrowhead base width as a fraction of the total path length. */
|
|
608
612
|
arrowheadWidthRatio?: number;
|
|
609
613
|
}
|
|
614
|
+
declare const DEFAULT_CLASSIC_ARROW_OPTIONS: Required<ClassicArrowOptions>;
|
|
610
615
|
/**
|
|
611
616
|
* Generates a GeoJSON FeatureCollection for the Classic Arrow: a shaft
|
|
612
617
|
* LineString (trimmed so it doesn't poke through the head) plus a head feature
|
|
@@ -638,7 +643,7 @@ declare function createClassicArrow(coordinates: Position[], options?: ClassicAr
|
|
|
638
643
|
type BlockArrowHeadStyle = "triangle" | "barbed" | "concave" | "diamond" | "harpoon" | "swallowtail" | "tee";
|
|
639
644
|
interface BlockArrowOptions {
|
|
640
645
|
/** Shaft band width as a fraction of the total path length. */
|
|
641
|
-
|
|
646
|
+
shaftWidthRatio?: number;
|
|
642
647
|
/** Arrowhead silhouette. */
|
|
643
648
|
arrowheadStyle?: BlockArrowHeadStyle;
|
|
644
649
|
/** Arrowhead base width as a fraction of the total path length. */
|
|
@@ -652,6 +657,7 @@ interface BlockArrowOptions {
|
|
|
652
657
|
/** Fill the body solid; when false the arrow is drawn as an outline only. */
|
|
653
658
|
filled?: boolean;
|
|
654
659
|
}
|
|
660
|
+
declare const DEFAULT_BLOCK_ARROW_OPTIONS: Required<BlockArrowOptions>;
|
|
655
661
|
/**
|
|
656
662
|
* Generates a GeoJSON FeatureCollection for the Block Arrow: a single filled
|
|
657
663
|
* Polygon whose outline runs up the left side of the shaft, around the head
|
|
@@ -742,8 +748,8 @@ declare function createAttackHelicopter(coordinates: Position[], options?: Attac
|
|
|
742
748
|
//#region src/generators/cm15-maneuver-areas/supportByFire.d.ts
|
|
743
749
|
interface SupportByFireOptions {
|
|
744
750
|
arrowheadWidthRatio?: number;
|
|
745
|
-
|
|
746
|
-
|
|
751
|
+
rearLineLengthRatio?: number;
|
|
752
|
+
rearLineAngle?: number;
|
|
747
753
|
}
|
|
748
754
|
declare const DEFAULT_SUPPORT_BY_FIRE_OPTIONS: Required<SupportByFireOptions>;
|
|
749
755
|
/**
|
|
@@ -760,8 +766,8 @@ declare function createSupportByFire(coordinates: Position[], options?: SupportB
|
|
|
760
766
|
//#region src/generators/cm15-maneuver-areas/attackByFire.d.ts
|
|
761
767
|
interface AttackByFireOptions {
|
|
762
768
|
arrowheadWidthRatio?: number;
|
|
763
|
-
|
|
764
|
-
|
|
769
|
+
rearLineLengthRatio?: number;
|
|
770
|
+
rearLineAngle?: number;
|
|
765
771
|
}
|
|
766
772
|
declare const DEFAULT_ATTACK_BY_FIRE_OPTIONS: Required<AttackByFireOptions>;
|
|
767
773
|
/**
|
|
@@ -810,7 +816,7 @@ interface FLOTOptions {
|
|
|
810
816
|
* Higher values create smoother arcs.
|
|
811
817
|
* @default 16
|
|
812
818
|
*/
|
|
813
|
-
|
|
819
|
+
arcSegments?: number;
|
|
814
820
|
}
|
|
815
821
|
/**
|
|
816
822
|
* Default options for the FLOT graphic.
|
|
@@ -831,7 +837,7 @@ declare const DEFAULT_FLOT_OPTIONS: Required<Omit<FLOTOptions, "metersPerPixel">
|
|
|
831
837
|
* ```typescript
|
|
832
838
|
* const flot = createFLOT(
|
|
833
839
|
* [[-122.4194, 37.7749], [-122.4100, 37.7800], [-122.4000, 37.7750]],
|
|
834
|
-
* { radius: 100,
|
|
840
|
+
* { radius: 100, arcSegments: 20 }
|
|
835
841
|
* );
|
|
836
842
|
* ```
|
|
837
843
|
*/
|
|
@@ -1126,21 +1132,21 @@ interface FortifiedLineOptions {
|
|
|
1126
1132
|
/**
|
|
1127
1133
|
* The size of the square teeth in meters.
|
|
1128
1134
|
* This controls both the width and height of the castellated pattern.
|
|
1129
|
-
* This is ignored if
|
|
1135
|
+
* This is ignored if toothSizePixels is provided along with metersPerPixel.
|
|
1130
1136
|
* @default 50
|
|
1131
1137
|
*/
|
|
1132
|
-
|
|
1138
|
+
toothSize?: number;
|
|
1133
1139
|
/**
|
|
1134
1140
|
* The size of the square teeth in pixels.
|
|
1135
1141
|
* When provided along with metersPerPixel, the actual meter size is calculated
|
|
1136
1142
|
* dynamically to maintain consistent visual size on screen.
|
|
1137
|
-
* Takes precedence over
|
|
1143
|
+
* Takes precedence over toothSize when metersPerPixel is also provided.
|
|
1138
1144
|
* @default 10
|
|
1139
1145
|
*/
|
|
1140
|
-
|
|
1146
|
+
toothSizePixels?: number;
|
|
1141
1147
|
/**
|
|
1142
1148
|
* The meters-per-pixel ratio at the current zoom level and latitude.
|
|
1143
|
-
* Required when using
|
|
1149
|
+
* Required when using toothSizePixels for zoom-aware sizing.
|
|
1144
1150
|
*/
|
|
1145
1151
|
metersPerPixel?: number;
|
|
1146
1152
|
/**
|
|
@@ -1787,7 +1793,7 @@ declare const rectangleDrawRule: ControlMeasureDrawRule;
|
|
|
1787
1793
|
*/
|
|
1788
1794
|
interface AmbushOptions {
|
|
1789
1795
|
/** Number of segments used to draw the quadratic curve (default: 30) */
|
|
1790
|
-
|
|
1796
|
+
arcSegments?: number;
|
|
1791
1797
|
/** Size of arrowhead relative to chord span (default: 0.15) */
|
|
1792
1798
|
arrowheadLengthRatio?: number;
|
|
1793
1799
|
/** Width of arrowhead wings relative to its length (default: 0.5) */
|
|
@@ -1822,4 +1828,4 @@ interface TacticalArrowOptions {
|
|
|
1822
1828
|
*/
|
|
1823
1829
|
declare const DEFAULT_TACTICAL_ARROW_OPTIONS: Required<TacticalArrowOptions>;
|
|
1824
1830
|
//#endregion
|
|
1825
|
-
export { getControlMeasureMetadata as $, DEFAULT_GENERIC_LINE_OPTIONS as $t, getMetersPerPixel as A, DEFAULT_CANALIZE_OPTIONS as At, ControlMeasureSnapshot as B, DEFAULT_ATTACK_BY_FIRE_OPTIONS as Bt, snapToMidpointPerpendicular as C,
|
|
1831
|
+
export { getControlMeasureMetadata as $, DEFAULT_GENERIC_LINE_OPTIONS as $t, getMetersPerPixel as A, ControlMeasureMetadata as An, DEFAULT_CANALIZE_OPTIONS as At, ControlMeasureSnapshot as B, DEFAULT_ATTACK_BY_FIRE_OPTIONS as Bt, snapToMidpointPerpendicular as C, StrongPointOptions as Cn, AntitankDitchOptions as Ct, BaselineFrameOrigin as D, DEFAULT_BOUNDARY_OPTIONS as Dn, ClearOptions as Dt, BaselineFrameOptions as E, BoundaryOptions as En, DelayOptions as Et, resolveStyleHints as F, BlockMissionTaskOptions as Ft, cloneControlMeasure as G, AirborneAttackOptions as Gt, StyleHints as H, SupportByFireOptions as Ht, freezeOrientationOptions as I, DEFAULT_BLOCK_MISSION_TASK_OPTIONS as It, CONTROL_MEASURE_IDS as J, GenericCircleOptions as Jt, isKind as K, DEFAULT_AIRBORNE_ATTACK_OPTIONS as Kt, RenderOptions as L, DEFAULT_FLOT_OPTIONS as Lt, SimpleStyleProps as M, AnchorTransformEvent as Mn, DEFAULT_BYPASS_OPTIONS as Mt, SimpleStyleRender as N, ControlMeasureDrawRule as Nn, BreachOptions as Nt, createBaselineFrame as O, ControlMeasureGeometry as On, DEFAULT_CLEAR_OPTIONS as Ot, toSimpleStyle as P, DEFAULT_BREACH_OPTIONS as Pt, OptionsByKind as Q, GenericPolygonOptions as Qt, renderControlMeasure as R, FLOTOptions as Rt, pointOnMidpointPerpendicularAxis as S, DEFAULT_STRONG_POINT_OPTIONS as Sn, DEFAULT_ANTITANK_WALL_OPTIONS as St, BaselineFrameNormal as T, DEFAULT_BATTLE_POSITION_OPTIONS as Tn, DEFAULT_DELAY_OPTIONS as Tt, controlMeasureIdFromFeature as U, AttackHelicopterOptions as Ut, FeaturePartProps as V, DEFAULT_SUPPORT_BY_FIRE_OPTIONS as Vt, ControlMeasure as W, DEFAULT_ATTACK_HELICOPTER_OPTIONS as Wt, ControlMeasureId as X, GenericRectangleOptions as Xt, CONTROL_MEASURE_METADATA as Y, DEFAULT_GENERIC_RECTANGLE_OPTIONS as Yt, ControlMeasureKind as Z, DEFAULT_GENERIC_POLYGON_OPTIONS as Zt, blockDrawRule as _, EncirclementOptions as _n, DEFAULT_FORTIFIED_AREA_OPTIONS as _t, rectangleDrawRule as a, ClassicArrowOptions as an, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS as at, createMidpointPerpendicularDrawRule as b, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS as bn, FortifiedLineOptions as bt, line24DrawRule as c, SupportingAttackOptions as cn, ObstacleBypassEasyOptions as ct, line1DrawRule as d, calculateMetrics as dn, DEFAULT_FIX_OPTIONS as dt, GenericLineOptions as en, getControlMeasureMetadataByValue as et, ambushDrawRule as f, computeInitialWidthPoint as fn, FixOptions as ft, disruptDrawRule as g, DEFAULT_ENCIRCLEMENT_OPTIONS as gn, DEFAULT_BLOCK_OPTIONS as gt, centerRadiusDrawRule as h, unproject as hn, BlockOptions as ht, DEFAULT_AMBUSH_OPTIONS as i, ClassicArrowHeadStyle as in, ObstacleBypassImpossibleOptions as it, roundToFixed as j, ParamDescriptor as jn, BypassOptions as jt, EPSILON as k, ControlMeasureGeometryType as kn, CanalizeOptions as kt, line23DrawRule as l, DEFAULT_MAIN_ATTACK_OPTIONS as ln, DEFAULT_TURN_OPTIONS as lt, point12DrawRule as m, project as mn, DisruptOptions as mt, TacticalArrowOptions as n, BlockArrowOptions as nn, listControlMeasureMetadata as nt, axis1DrawRule as o, DEFAULT_CLASSIC_ARROW_OPTIONS as on, ObstacleBypassDifficultOptions as ot, attackByFireDrawRule as p, Point2D as pn, DEFAULT_DISRUPT_OPTIONS as pt, ControlMeasureStyle as q, DEFAULT_GENERIC_CIRCLE_OPTIONS as qt, AmbushOptions as r, DEFAULT_BLOCK_ARROW_OPTIONS as rn, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS as rt, supportByFireDrawRule as s, DEFAULT_SUPPORTING_ATTACK_OPTIONS as sn, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS as st, DEFAULT_TACTICAL_ARROW_OPTIONS as t, BlockArrowHeadStyle as tn, getDefaultOptions as tt, turnDrawRule as u, MainAttackOptions as un, TurnOptions as ut, MidpointPerpendicularDrawRuleOptions as v, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS as vn, FortifiedAreaOptions as vt, BaselineFrame as w, BattlePositionOptions as wn, DEFAULT_ANTITANK_DITCH_OPTIONS as wt, getMidpointPerpendicularSignedDistance as x, PrincipalDirectionOfFireOptions as xn, AntitankWallOptions as xt, computeDefaultMidpointPerpendicularPoint as y, FinalProtectiveFireOptions as yn, DEFAULT_FORTIFIED_LINE_OPTIONS as yt, ControlMeasureRender as z, AttackByFireOptions as zt };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { $ as getControlMeasureMetadata, $t as DEFAULT_GENERIC_LINE_OPTIONS, A as getMetersPerPixel, At as DEFAULT_CANALIZE_OPTIONS, B as ControlMeasureSnapshot, Bt as DEFAULT_ATTACK_BY_FIRE_OPTIONS, C as snapToMidpointPerpendicular, Cn as
|
|
2
|
-
export { type AirborneAttackOptions, type AmbushOptions, type AnchorTransformEvent, type AntitankDitchOptions, type AntitankWallOptions, type AttackByFireOptions, type AttackHelicopterOptions, type BaselineFrame, type BaselineFrameNormal, type BaselineFrameOptions, type BaselineFrameOrigin, type BlockMissionTaskOptions, type BlockOptions, type BreachOptions, type BypassOptions, CONTROL_MEASURE_IDS, CONTROL_MEASURE_METADATA, type CanalizeOptions, type ClearOptions, type ControlMeasure, type ControlMeasureDrawRule, type ControlMeasureGeometry, type ControlMeasureGeometryType, type ControlMeasureId, type ControlMeasureKind, type ControlMeasureMetadata, type ControlMeasureRender, type ControlMeasureSnapshot, type ControlMeasureStyle, DEFAULT_AIRBORNE_ATTACK_OPTIONS, DEFAULT_AMBUSH_OPTIONS, DEFAULT_ANTITANK_DITCH_OPTIONS, DEFAULT_ANTITANK_WALL_OPTIONS, DEFAULT_ATTACK_BY_FIRE_OPTIONS, DEFAULT_ATTACK_HELICOPTER_OPTIONS, DEFAULT_BLOCK_MISSION_TASK_OPTIONS, DEFAULT_BLOCK_OPTIONS, DEFAULT_BREACH_OPTIONS, DEFAULT_BYPASS_OPTIONS, DEFAULT_CANALIZE_OPTIONS, DEFAULT_CLEAR_OPTIONS, DEFAULT_DELAY_OPTIONS, DEFAULT_DISRUPT_OPTIONS, DEFAULT_ENCIRCLEMENT_OPTIONS, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, DEFAULT_FIX_OPTIONS, DEFAULT_FLOT_OPTIONS, DEFAULT_FORTIFIED_AREA_OPTIONS, DEFAULT_FORTIFIED_LINE_OPTIONS, DEFAULT_GENERIC_CIRCLE_OPTIONS, DEFAULT_GENERIC_LINE_OPTIONS, DEFAULT_GENERIC_POLYGON_OPTIONS, DEFAULT_GENERIC_RECTANGLE_OPTIONS, DEFAULT_MAIN_ATTACK_OPTIONS, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_STRONG_POINT_OPTIONS, DEFAULT_SUPPORTING_ATTACK_OPTIONS, DEFAULT_SUPPORT_BY_FIRE_OPTIONS, DEFAULT_TACTICAL_ARROW_OPTIONS, DEFAULT_TURN_OPTIONS, type DelayOptions, type DisruptOptions, EPSILON, type EncirclementOptions, type FLOTOptions, type FeaturePartProps, type FinalProtectiveFireOptions, type FixOptions, type FortifiedAreaOptions, type FortifiedLineOptions, type GenericCircleOptions, type GenericLineOptions, type GenericPolygonOptions, type GenericRectangleOptions, type MainAttackOptions, type MidpointPerpendicularDrawRuleOptions, type ObstacleBypassDifficultOptions, type ObstacleBypassEasyOptions, type ObstacleBypassImpossibleOptions, type OptionsByKind, type ParamDescriptor, type Point2D, type PrincipalDirectionOfFireOptions, type RenderOptions, type SimpleStyleProps, type SimpleStyleRender, type StrongPointOptions, type StyleHints, type SupportByFireOptions, type SupportingAttackOptions, type TacticalArrowOptions, type TurnOptions, ambushDrawRule, attackByFireDrawRule, axis1DrawRule, blockDrawRule, calculateMetrics, centerRadiusDrawRule, cloneControlMeasure, computeDefaultMidpointPerpendicularPoint, computeInitialWidthPoint, controlMeasureIdFromFeature, createBaselineFrame, createMidpointPerpendicularDrawRule, disruptDrawRule, freezeOrientationOptions, getControlMeasureMetadata, getControlMeasureMetadataByValue, getDefaultOptions, getMetersPerPixel, getMidpointPerpendicularSignedDistance, isKind, line1DrawRule, line23DrawRule, line24DrawRule, listControlMeasureMetadata, point12DrawRule, pointOnMidpointPerpendicularAxis, project, rectangleDrawRule, renderControlMeasure, resolveStyleHints, roundToFixed, snapToMidpointPerpendicular, supportByFireDrawRule, toSimpleStyle, turnDrawRule, unproject };
|
|
1
|
+
import { $ as getControlMeasureMetadata, $t as DEFAULT_GENERIC_LINE_OPTIONS, A as getMetersPerPixel, An as ControlMeasureMetadata, At as DEFAULT_CANALIZE_OPTIONS, B as ControlMeasureSnapshot, Bt as DEFAULT_ATTACK_BY_FIRE_OPTIONS, C as snapToMidpointPerpendicular, Cn as StrongPointOptions, Ct as AntitankDitchOptions, D as BaselineFrameOrigin, Dn as DEFAULT_BOUNDARY_OPTIONS, Dt as ClearOptions, E as BaselineFrameOptions, En as BoundaryOptions, Et as DelayOptions, F as resolveStyleHints, Ft as BlockMissionTaskOptions, G as cloneControlMeasure, Gt as AirborneAttackOptions, H as StyleHints, Ht as SupportByFireOptions, I as freezeOrientationOptions, It as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, J as CONTROL_MEASURE_IDS, Jt as GenericCircleOptions, K as isKind, Kt as DEFAULT_AIRBORNE_ATTACK_OPTIONS, L as RenderOptions, Lt as DEFAULT_FLOT_OPTIONS, M as SimpleStyleProps, Mn as AnchorTransformEvent, Mt as DEFAULT_BYPASS_OPTIONS, N as SimpleStyleRender, Nn as ControlMeasureDrawRule, Nt as BreachOptions, O as createBaselineFrame, On as ControlMeasureGeometry, Ot as DEFAULT_CLEAR_OPTIONS, P as toSimpleStyle, Pt as DEFAULT_BREACH_OPTIONS, Q as OptionsByKind, Qt as GenericPolygonOptions, R as renderControlMeasure, Rt as FLOTOptions, S as pointOnMidpointPerpendicularAxis, Sn as DEFAULT_STRONG_POINT_OPTIONS, St as DEFAULT_ANTITANK_WALL_OPTIONS, T as BaselineFrameNormal, Tn as DEFAULT_BATTLE_POSITION_OPTIONS, Tt as DEFAULT_DELAY_OPTIONS, U as controlMeasureIdFromFeature, Ut as AttackHelicopterOptions, V as FeaturePartProps, Vt as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, W as ControlMeasure, Wt as DEFAULT_ATTACK_HELICOPTER_OPTIONS, X as ControlMeasureId, Xt as GenericRectangleOptions, Y as CONTROL_MEASURE_METADATA, Yt as DEFAULT_GENERIC_RECTANGLE_OPTIONS, Z as ControlMeasureKind, Zt as DEFAULT_GENERIC_POLYGON_OPTIONS, _ as blockDrawRule, _n as EncirclementOptions, _t as DEFAULT_FORTIFIED_AREA_OPTIONS, a as rectangleDrawRule, an as ClassicArrowOptions, at as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, b as createMidpointPerpendicularDrawRule, bn as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, bt as FortifiedLineOptions, c as line24DrawRule, cn as SupportingAttackOptions, ct as ObstacleBypassEasyOptions, d as line1DrawRule, dn as calculateMetrics, dt as DEFAULT_FIX_OPTIONS, en as GenericLineOptions, et as getControlMeasureMetadataByValue, f as ambushDrawRule, fn as computeInitialWidthPoint, ft as FixOptions, g as disruptDrawRule, gn as DEFAULT_ENCIRCLEMENT_OPTIONS, gt as DEFAULT_BLOCK_OPTIONS, h as centerRadiusDrawRule, hn as unproject, ht as BlockOptions, i as DEFAULT_AMBUSH_OPTIONS, in as ClassicArrowHeadStyle, it as ObstacleBypassImpossibleOptions, j as roundToFixed, jn as ParamDescriptor, jt as BypassOptions, k as EPSILON, kn as ControlMeasureGeometryType, kt as CanalizeOptions, l as line23DrawRule, ln as DEFAULT_MAIN_ATTACK_OPTIONS, lt as DEFAULT_TURN_OPTIONS, m as point12DrawRule, mn as project, mt as DisruptOptions, n as TacticalArrowOptions, nn as BlockArrowOptions, nt as listControlMeasureMetadata, o as axis1DrawRule, on as DEFAULT_CLASSIC_ARROW_OPTIONS, ot as ObstacleBypassDifficultOptions, p as attackByFireDrawRule, pn as Point2D, pt as DEFAULT_DISRUPT_OPTIONS, q as ControlMeasureStyle, qt as DEFAULT_GENERIC_CIRCLE_OPTIONS, r as AmbushOptions, rn as DEFAULT_BLOCK_ARROW_OPTIONS, rt as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, s as supportByFireDrawRule, sn as DEFAULT_SUPPORTING_ATTACK_OPTIONS, st as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, t as DEFAULT_TACTICAL_ARROW_OPTIONS, tn as BlockArrowHeadStyle, tt as getDefaultOptions, u as turnDrawRule, un as MainAttackOptions, ut as TurnOptions, v as MidpointPerpendicularDrawRuleOptions, vn as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, vt as FortifiedAreaOptions, w as BaselineFrame, wn as BattlePositionOptions, wt as DEFAULT_ANTITANK_DITCH_OPTIONS, x as getMidpointPerpendicularSignedDistance, xn as PrincipalDirectionOfFireOptions, xt as AntitankWallOptions, y as computeDefaultMidpointPerpendicularPoint, yn as FinalProtectiveFireOptions, yt as DEFAULT_FORTIFIED_LINE_OPTIONS, z as ControlMeasureRender, zt as AttackByFireOptions } from "./index-BHWESyWA.mjs";
|
|
2
|
+
export { type AirborneAttackOptions, type AmbushOptions, type AnchorTransformEvent, type AntitankDitchOptions, type AntitankWallOptions, type AttackByFireOptions, type AttackHelicopterOptions, type BaselineFrame, type BaselineFrameNormal, type BaselineFrameOptions, type BaselineFrameOrigin, type BattlePositionOptions, type BlockArrowHeadStyle, type BlockArrowOptions, type BlockMissionTaskOptions, type BlockOptions, type BoundaryOptions, type BreachOptions, type BypassOptions, CONTROL_MEASURE_IDS, CONTROL_MEASURE_METADATA, type CanalizeOptions, type ClassicArrowHeadStyle, type ClassicArrowOptions, type ClearOptions, type ControlMeasure, type ControlMeasureDrawRule, type ControlMeasureGeometry, type ControlMeasureGeometryType, type ControlMeasureId, type ControlMeasureKind, type ControlMeasureMetadata, type ControlMeasureRender, type ControlMeasureSnapshot, type ControlMeasureStyle, DEFAULT_AIRBORNE_ATTACK_OPTIONS, DEFAULT_AMBUSH_OPTIONS, DEFAULT_ANTITANK_DITCH_OPTIONS, DEFAULT_ANTITANK_WALL_OPTIONS, DEFAULT_ATTACK_BY_FIRE_OPTIONS, DEFAULT_ATTACK_HELICOPTER_OPTIONS, DEFAULT_BATTLE_POSITION_OPTIONS, DEFAULT_BLOCK_ARROW_OPTIONS, DEFAULT_BLOCK_MISSION_TASK_OPTIONS, DEFAULT_BLOCK_OPTIONS, DEFAULT_BOUNDARY_OPTIONS, DEFAULT_BREACH_OPTIONS, DEFAULT_BYPASS_OPTIONS, DEFAULT_CANALIZE_OPTIONS, DEFAULT_CLASSIC_ARROW_OPTIONS, DEFAULT_CLEAR_OPTIONS, DEFAULT_DELAY_OPTIONS, DEFAULT_DISRUPT_OPTIONS, DEFAULT_ENCIRCLEMENT_OPTIONS, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, DEFAULT_FIX_OPTIONS, DEFAULT_FLOT_OPTIONS, DEFAULT_FORTIFIED_AREA_OPTIONS, DEFAULT_FORTIFIED_LINE_OPTIONS, DEFAULT_GENERIC_CIRCLE_OPTIONS, DEFAULT_GENERIC_LINE_OPTIONS, DEFAULT_GENERIC_POLYGON_OPTIONS, DEFAULT_GENERIC_RECTANGLE_OPTIONS, DEFAULT_MAIN_ATTACK_OPTIONS, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_STRONG_POINT_OPTIONS, DEFAULT_SUPPORTING_ATTACK_OPTIONS, DEFAULT_SUPPORT_BY_FIRE_OPTIONS, DEFAULT_TACTICAL_ARROW_OPTIONS, DEFAULT_TURN_OPTIONS, type DelayOptions, type DisruptOptions, EPSILON, type EncirclementOptions, type FLOTOptions, type FeaturePartProps, type FinalProtectiveFireOptions, type FixOptions, type FortifiedAreaOptions, type FortifiedLineOptions, type GenericCircleOptions, type GenericLineOptions, type GenericPolygonOptions, type GenericRectangleOptions, type MainAttackOptions, type MidpointPerpendicularDrawRuleOptions, type ObstacleBypassDifficultOptions, type ObstacleBypassEasyOptions, type ObstacleBypassImpossibleOptions, type OptionsByKind, type ParamDescriptor, type Point2D, type PrincipalDirectionOfFireOptions, type RenderOptions, type SimpleStyleProps, type SimpleStyleRender, type StrongPointOptions, type StyleHints, type SupportByFireOptions, type SupportingAttackOptions, type TacticalArrowOptions, type TurnOptions, ambushDrawRule, attackByFireDrawRule, axis1DrawRule, blockDrawRule, calculateMetrics, centerRadiusDrawRule, cloneControlMeasure, computeDefaultMidpointPerpendicularPoint, computeInitialWidthPoint, controlMeasureIdFromFeature, createBaselineFrame, createMidpointPerpendicularDrawRule, disruptDrawRule, freezeOrientationOptions, getControlMeasureMetadata, getControlMeasureMetadataByValue, getDefaultOptions, getMetersPerPixel, getMidpointPerpendicularSignedDistance, isKind, line1DrawRule, line23DrawRule, line24DrawRule, listControlMeasureMetadata, point12DrawRule, pointOnMidpointPerpendicularAxis, project, rectangleDrawRule, renderControlMeasure, resolveStyleHints, roundToFixed, snapToMidpointPerpendicular, supportByFireDrawRule, toSimpleStyle, turnDrawRule, unproject };
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as
|
|
1
|
+
import { $ as turnDrawRule, A as DEFAULT_GENERIC_POLYGON_OPTIONS, B as DEFAULT_BLOCK_OPTIONS, C as DEFAULT_FIX_OPTIONS, D as DEFAULT_DELAY_OPTIONS, E as DEFAULT_DISRUPT_OPTIONS, F as DEFAULT_BYPASS_OPTIONS, G as DEFAULT_ANTITANK_DITCH_OPTIONS, H as DEFAULT_ATTACK_HELICOPTER_OPTIONS, I as DEFAULT_BREACH_OPTIONS, J as rectangleDrawRule, K as DEFAULT_AMBUSH_OPTIONS, L as DEFAULT_BLOCK_MISSION_TASK_OPTIONS, M as DEFAULT_GENERIC_CIRCLE_OPTIONS, N as DEFAULT_CLASSIC_ARROW_OPTIONS, O as DEFAULT_CLEAR_OPTIONS, P as DEFAULT_CANALIZE_OPTIONS, Q as line23DrawRule, R as DEFAULT_BOUNDARY_OPTIONS, S as DEFAULT_FLOT_OPTIONS, T as DEFAULT_ENCIRCLEMENT_OPTIONS, U as DEFAULT_ATTACK_BY_FIRE_OPTIONS, V as DEFAULT_BATTLE_POSITION_OPTIONS, W as DEFAULT_ANTITANK_WALL_OPTIONS, X as supportByFireDrawRule, Y as axis1DrawRule, Z as line24DrawRule, _ as DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, _t as EPSILON, a as DEFINITIONS, at as disruptDrawRule, b as DEFAULT_FORTIFIED_AREA_OPTIONS, c as getDefaultOptions, ct as createMidpointPerpendicularDrawRule, d as DEFAULT_SUPPORTING_ATTACK_OPTIONS, dt as snapToMidpointPerpendicular, et as line1DrawRule, f as DEFAULT_SUPPORT_BY_FIRE_OPTIONS, ft as createBaselineFrame, g as DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, gt as unproject, h as DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, ht as project, i as CONTROL_MEASURE_METADATA, it as centerRadiusDrawRule, j as DEFAULT_GENERIC_LINE_OPTIONS, k as DEFAULT_GENERIC_RECTANGLE_OPTIONS, l as listControlMeasureMetadata, lt as getMidpointPerpendicularSignedDistance, m as DEFAULT_TACTICAL_ARROW_OPTIONS, mt as computeInitialWidthPoint, n as resolveStyleHints, nt as attackByFireDrawRule, o as getControlMeasureMetadata, ot as blockDrawRule, p as DEFAULT_STRONG_POINT_OPTIONS, pt as calculateMetrics, q as DEFAULT_AIRBORNE_ATTACK_OPTIONS, r as CONTROL_MEASURE_IDS, rt as point12DrawRule, s as getControlMeasureMetadataByValue, st as computeDefaultMidpointPerpendicularPoint, t as renderControlMeasure, tt as ambushDrawRule, u as DEFAULT_TURN_OPTIONS, ut as pointOnMidpointPerpendicularAxis, v as DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, vt as getMetersPerPixel, w as DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, x as DEFAULT_FORTIFIED_LINE_OPTIONS, y as DEFAULT_MAIN_ATTACK_OPTIONS, yt as roundToFixed, z as DEFAULT_BLOCK_ARROW_OPTIONS } from "./renderControlMeasure-DnM2w9jS.mjs";
|
|
2
2
|
//#region src/freeze-orientation.ts
|
|
3
3
|
/**
|
|
4
4
|
* Dispatches to a measure kind's `freezeOrientation` hook (see
|
|
@@ -114,4 +114,4 @@ function toHexChannel(value) {
|
|
|
114
114
|
return Math.max(0, Math.min(255, Math.round(value))).toString(16).padStart(2, "0");
|
|
115
115
|
}
|
|
116
116
|
//#endregion
|
|
117
|
-
export { CONTROL_MEASURE_IDS, CONTROL_MEASURE_METADATA, DEFAULT_AIRBORNE_ATTACK_OPTIONS, DEFAULT_AMBUSH_OPTIONS, DEFAULT_ANTITANK_DITCH_OPTIONS, DEFAULT_ANTITANK_WALL_OPTIONS, DEFAULT_ATTACK_BY_FIRE_OPTIONS, DEFAULT_ATTACK_HELICOPTER_OPTIONS, DEFAULT_BLOCK_MISSION_TASK_OPTIONS, DEFAULT_BLOCK_OPTIONS, DEFAULT_BREACH_OPTIONS, DEFAULT_BYPASS_OPTIONS, DEFAULT_CANALIZE_OPTIONS, DEFAULT_CLEAR_OPTIONS, DEFAULT_DELAY_OPTIONS, DEFAULT_DISRUPT_OPTIONS, DEFAULT_ENCIRCLEMENT_OPTIONS, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, DEFAULT_FIX_OPTIONS, DEFAULT_FLOT_OPTIONS, DEFAULT_FORTIFIED_AREA_OPTIONS, DEFAULT_FORTIFIED_LINE_OPTIONS, DEFAULT_GENERIC_CIRCLE_OPTIONS, DEFAULT_GENERIC_LINE_OPTIONS, DEFAULT_GENERIC_POLYGON_OPTIONS, DEFAULT_GENERIC_RECTANGLE_OPTIONS, DEFAULT_MAIN_ATTACK_OPTIONS, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_STRONG_POINT_OPTIONS, DEFAULT_SUPPORTING_ATTACK_OPTIONS, DEFAULT_SUPPORT_BY_FIRE_OPTIONS, DEFAULT_TACTICAL_ARROW_OPTIONS, DEFAULT_TURN_OPTIONS, EPSILON, ambushDrawRule, attackByFireDrawRule, axis1DrawRule, blockDrawRule, calculateMetrics, centerRadiusDrawRule, cloneControlMeasure, computeDefaultMidpointPerpendicularPoint, computeInitialWidthPoint, controlMeasureIdFromFeature, createBaselineFrame, createMidpointPerpendicularDrawRule, disruptDrawRule, freezeOrientationOptions, getControlMeasureMetadata, getControlMeasureMetadataByValue, getDefaultOptions, getMetersPerPixel, getMidpointPerpendicularSignedDistance, isKind, line1DrawRule, line23DrawRule, line24DrawRule, listControlMeasureMetadata, point12DrawRule, pointOnMidpointPerpendicularAxis, project, rectangleDrawRule, renderControlMeasure, resolveStyleHints, roundToFixed, snapToMidpointPerpendicular, supportByFireDrawRule, toSimpleStyle, turnDrawRule, unproject };
|
|
117
|
+
export { CONTROL_MEASURE_IDS, CONTROL_MEASURE_METADATA, DEFAULT_AIRBORNE_ATTACK_OPTIONS, DEFAULT_AMBUSH_OPTIONS, DEFAULT_ANTITANK_DITCH_OPTIONS, DEFAULT_ANTITANK_WALL_OPTIONS, DEFAULT_ATTACK_BY_FIRE_OPTIONS, DEFAULT_ATTACK_HELICOPTER_OPTIONS, DEFAULT_BATTLE_POSITION_OPTIONS, DEFAULT_BLOCK_ARROW_OPTIONS, DEFAULT_BLOCK_MISSION_TASK_OPTIONS, DEFAULT_BLOCK_OPTIONS, DEFAULT_BOUNDARY_OPTIONS, DEFAULT_BREACH_OPTIONS, DEFAULT_BYPASS_OPTIONS, DEFAULT_CANALIZE_OPTIONS, DEFAULT_CLASSIC_ARROW_OPTIONS, DEFAULT_CLEAR_OPTIONS, DEFAULT_DELAY_OPTIONS, DEFAULT_DISRUPT_OPTIONS, DEFAULT_ENCIRCLEMENT_OPTIONS, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS, DEFAULT_FIX_OPTIONS, DEFAULT_FLOT_OPTIONS, DEFAULT_FORTIFIED_AREA_OPTIONS, DEFAULT_FORTIFIED_LINE_OPTIONS, DEFAULT_GENERIC_CIRCLE_OPTIONS, DEFAULT_GENERIC_LINE_OPTIONS, DEFAULT_GENERIC_POLYGON_OPTIONS, DEFAULT_GENERIC_RECTANGLE_OPTIONS, DEFAULT_MAIN_ATTACK_OPTIONS, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS, DEFAULT_STRONG_POINT_OPTIONS, DEFAULT_SUPPORTING_ATTACK_OPTIONS, DEFAULT_SUPPORT_BY_FIRE_OPTIONS, DEFAULT_TACTICAL_ARROW_OPTIONS, DEFAULT_TURN_OPTIONS, EPSILON, ambushDrawRule, attackByFireDrawRule, axis1DrawRule, blockDrawRule, calculateMetrics, centerRadiusDrawRule, cloneControlMeasure, computeDefaultMidpointPerpendicularPoint, computeInitialWidthPoint, controlMeasureIdFromFeature, createBaselineFrame, createMidpointPerpendicularDrawRule, disruptDrawRule, freezeOrientationOptions, getControlMeasureMetadata, getControlMeasureMetadataByValue, getDefaultOptions, getMetersPerPixel, getMidpointPerpendicularSignedDistance, isKind, line1DrawRule, line23DrawRule, line24DrawRule, listControlMeasureMetadata, point12DrawRule, pointOnMidpointPerpendicularAxis, project, rectangleDrawRule, renderControlMeasure, resolveStyleHints, roundToFixed, snapToMidpointPerpendicular, supportByFireDrawRule, toSimpleStyle, turnDrawRule, unproject };
|
package/dist/preview/index.d.mts
CHANGED
package/dist/preview/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as DEFINITIONS, t as renderControlMeasure } from "../renderControlMeasure-
|
|
1
|
+
import { a as DEFINITIONS, t as renderControlMeasure } from "../renderControlMeasure-DnM2w9jS.mjs";
|
|
2
2
|
//#region src/preview/index.ts
|
|
3
3
|
/**
|
|
4
4
|
* Unitless `previewSample` points (~`[-1, 1]`) are scaled by this degree offset
|
|
@@ -206,8 +206,8 @@ const SHAFT_MAX_RATIO = .9;
|
|
|
206
206
|
*/
|
|
207
207
|
function processAttackGeometry(coordinates, options = {}) {
|
|
208
208
|
const shaftRatio = clamp(options.shaftWidthRatio ?? .6, SHAFT_MIN_RATIO, SHAFT_MAX_RATIO);
|
|
209
|
-
const
|
|
210
|
-
const
|
|
209
|
+
const smooth = options.smooth ?? false;
|
|
210
|
+
const smoothResolution = options.smoothResolution ?? 5;
|
|
211
211
|
const points = coordinates.map((c) => project(c[0], c[1]));
|
|
212
212
|
const numPoints = points.length;
|
|
213
213
|
const ptTip = points[0];
|
|
@@ -217,9 +217,9 @@ function processAttackGeometry(coordinates, options = {}) {
|
|
|
217
217
|
const p = points[i];
|
|
218
218
|
if (p) spinePoints.push(p);
|
|
219
219
|
}
|
|
220
|
-
return { geometry: calculateSymbolGeometry(ptTip, ptWidth, spinePoints, shaftRatio,
|
|
220
|
+
return { geometry: calculateSymbolGeometry(ptTip, ptWidth, spinePoints, shaftRatio, smooth, smoothResolution) };
|
|
221
221
|
}
|
|
222
|
-
function calculateSymbolGeometry(ptTip, ptWidth, spine, shaftRatio,
|
|
222
|
+
function calculateSymbolGeometry(ptTip, ptWidth, spine, shaftRatio, smooth, smoothResolution) {
|
|
223
223
|
const initialNeck = spine[spine.length - 1];
|
|
224
224
|
if (!initialNeck) return null;
|
|
225
225
|
const initialTipDir = vecNorm(vecSub(ptTip, initialNeck));
|
|
@@ -273,8 +273,8 @@ function calculateSymbolGeometry(ptTip, ptWidth, spine, shaftRatio, roundedBends
|
|
|
273
273
|
];
|
|
274
274
|
const fullSpine = [...remainingSpine, shaftEndCenter];
|
|
275
275
|
return {
|
|
276
|
-
shaftLeft: offsetPolyline(fullSpine, shaftHalfWidth,
|
|
277
|
-
shaftRight: offsetPolyline(fullSpine, -shaftHalfWidth,
|
|
276
|
+
shaftLeft: offsetPolyline(fullSpine, shaftHalfWidth, smooth, smoothResolution),
|
|
277
|
+
shaftRight: offsetPolyline(fullSpine, -shaftHalfWidth, smooth, smoothResolution),
|
|
278
278
|
headRing,
|
|
279
279
|
ptTip,
|
|
280
280
|
ptNeck,
|
|
@@ -975,20 +975,20 @@ const ATTACK_SHAFT_PARAMS = [
|
|
|
975
975
|
step: .05
|
|
976
976
|
},
|
|
977
977
|
{
|
|
978
|
-
key: "
|
|
979
|
-
label: "
|
|
978
|
+
key: "smooth",
|
|
979
|
+
label: "Smooth",
|
|
980
980
|
description: "Round the corners where the shaft changes direction.",
|
|
981
981
|
type: "boolean"
|
|
982
982
|
},
|
|
983
983
|
{
|
|
984
|
-
key: "
|
|
985
|
-
label: "
|
|
986
|
-
description: "Number of segments approximating each rounded bend",
|
|
984
|
+
key: "smoothResolution",
|
|
985
|
+
label: "Smooth resolution",
|
|
986
|
+
description: "Number of segments approximating each rounded bend when smooth mode is enabled.",
|
|
987
987
|
type: "number",
|
|
988
988
|
min: 1,
|
|
989
989
|
max: 20,
|
|
990
990
|
step: 1,
|
|
991
|
-
visibleWhen: (opts) => opts.
|
|
991
|
+
visibleWhen: (opts) => opts.smooth === true
|
|
992
992
|
}
|
|
993
993
|
];
|
|
994
994
|
const FIRE_ARROW_PARAMS = [
|
|
@@ -1002,8 +1002,8 @@ const FIRE_ARROW_PARAMS = [
|
|
|
1002
1002
|
step: .01
|
|
1003
1003
|
},
|
|
1004
1004
|
{
|
|
1005
|
-
key: "
|
|
1006
|
-
label: "
|
|
1005
|
+
key: "rearLineLengthRatio",
|
|
1006
|
+
label: "Rear line length",
|
|
1007
1007
|
description: "Length of the rear flare lines as a ratio of the head",
|
|
1008
1008
|
type: "number",
|
|
1009
1009
|
min: .05,
|
|
@@ -1011,8 +1011,8 @@ const FIRE_ARROW_PARAMS = [
|
|
|
1011
1011
|
step: .01
|
|
1012
1012
|
},
|
|
1013
1013
|
{
|
|
1014
|
-
key: "
|
|
1015
|
-
label: "
|
|
1014
|
+
key: "rearLineAngle",
|
|
1015
|
+
label: "Rear line angle",
|
|
1016
1016
|
description: "Angle of the rear flare lines, in degrees",
|
|
1017
1017
|
type: "number",
|
|
1018
1018
|
min: 0,
|
|
@@ -1021,8 +1021,8 @@ const FIRE_ARROW_PARAMS = [
|
|
|
1021
1021
|
}
|
|
1022
1022
|
];
|
|
1023
1023
|
const FORTIFIED_AREA_SIZE_PARAMS = [{
|
|
1024
|
-
key: "
|
|
1025
|
-
label: "
|
|
1024
|
+
key: "toothSizePixels",
|
|
1025
|
+
label: "Tooth size",
|
|
1026
1026
|
description: "Size of the fortified-area teeth, in pixels",
|
|
1027
1027
|
type: "number",
|
|
1028
1028
|
min: 5,
|
|
@@ -1030,8 +1030,8 @@ const FORTIFIED_AREA_SIZE_PARAMS = [{
|
|
|
1030
1030
|
step: 1,
|
|
1031
1031
|
unit: "px"
|
|
1032
1032
|
}, {
|
|
1033
|
-
key: "
|
|
1034
|
-
label: "
|
|
1033
|
+
key: "toothSize",
|
|
1034
|
+
label: "Tooth size",
|
|
1035
1035
|
description: "Size of the fortified-area teeth, in meters",
|
|
1036
1036
|
type: "number",
|
|
1037
1037
|
min: 1,
|
|
@@ -1098,8 +1098,8 @@ const FORTIFIED_AREA_PARAMS = [
|
|
|
1098
1098
|
//#region src/generators/cm15-maneuver-areas/airborneAttack.ts
|
|
1099
1099
|
const DEFAULT_AIRBORNE_ATTACK_OPTIONS = {
|
|
1100
1100
|
shaftWidthRatio: DEFAULT_SHAFT_WIDTH_RATIO,
|
|
1101
|
-
|
|
1102
|
-
|
|
1101
|
+
smooth: false,
|
|
1102
|
+
smoothResolution: 5
|
|
1103
1103
|
};
|
|
1104
1104
|
const AIRBORNE_ATTACK_METADATA = {
|
|
1105
1105
|
id: "airborne-attack",
|
|
@@ -1194,7 +1194,7 @@ const DEFAULT_AMBUSH_OPTIONS = {
|
|
|
1194
1194
|
hatchLengthRatio: .15,
|
|
1195
1195
|
hatchCount: 5,
|
|
1196
1196
|
curveDepthRatio: .25,
|
|
1197
|
-
|
|
1197
|
+
arcSegments: 30
|
|
1198
1198
|
};
|
|
1199
1199
|
const AMBUSH_METADATA = {
|
|
1200
1200
|
id: "ambush",
|
|
@@ -1255,8 +1255,8 @@ const AMBUSH_METADATA = {
|
|
|
1255
1255
|
step: .01
|
|
1256
1256
|
},
|
|
1257
1257
|
{
|
|
1258
|
-
key: "
|
|
1259
|
-
label: "
|
|
1258
|
+
key: "arcSegments",
|
|
1259
|
+
label: "Arc segments",
|
|
1260
1260
|
description: "Number of segments used to render the curve",
|
|
1261
1261
|
type: "number",
|
|
1262
1262
|
min: 4,
|
|
@@ -1278,11 +1278,11 @@ const quadBezier = (t, a, b, c) => {
|
|
|
1278
1278
|
* @returns GeoJSON FeatureCollection containing LineString components
|
|
1279
1279
|
*/
|
|
1280
1280
|
function createAmbushSymbol(coordinates, options = {}) {
|
|
1281
|
-
const { arrowheadLengthRatio, arrowheadWidthRatio, hatchLengthRatio, hatchCount, curveDepthRatio,
|
|
1281
|
+
const { arrowheadLengthRatio, arrowheadWidthRatio, hatchLengthRatio, hatchCount, curveDepthRatio, arcSegments } = {
|
|
1282
1282
|
...DEFAULT_AMBUSH_OPTIONS,
|
|
1283
1283
|
...options
|
|
1284
1284
|
};
|
|
1285
|
-
const
|
|
1285
|
+
const safeArcSegments = Math.max(1, Math.floor(arcSegments));
|
|
1286
1286
|
const safeHatchCount = Math.max(0, Math.floor(hatchCount));
|
|
1287
1287
|
const safeArrowheadLengthRatio = Math.max(0, arrowheadLengthRatio);
|
|
1288
1288
|
const safeArrowheadWidthRatio = Math.max(0, arrowheadWidthRatio);
|
|
@@ -1315,8 +1315,8 @@ function createAmbushSymbol(coordinates, options = {}) {
|
|
|
1315
1315
|
vecSub(hBase, vecScale(perp, hw))
|
|
1316
1316
|
]);
|
|
1317
1317
|
const curve = [];
|
|
1318
|
-
for (let i = 0; i <=
|
|
1319
|
-
const t = i /
|
|
1318
|
+
for (let i = 0; i <= safeArcSegments; i++) {
|
|
1319
|
+
const t = i / safeArcSegments;
|
|
1320
1320
|
curve.push(quadBezier(t, p2, ctrl, p3));
|
|
1321
1321
|
}
|
|
1322
1322
|
lines.push(curve);
|
|
@@ -1363,8 +1363,8 @@ const FORTIFIED_PARAMS = [
|
|
|
1363
1363
|
visibleWhen: (opts) => Boolean(opts.smooth)
|
|
1364
1364
|
},
|
|
1365
1365
|
{
|
|
1366
|
-
key: "
|
|
1367
|
-
label: "
|
|
1366
|
+
key: "toothSizePixels",
|
|
1367
|
+
label: "Tooth size",
|
|
1368
1368
|
description: "Side length of the square crenellations",
|
|
1369
1369
|
type: "number",
|
|
1370
1370
|
min: 5,
|
|
@@ -1373,8 +1373,8 @@ const FORTIFIED_PARAMS = [
|
|
|
1373
1373
|
unit: "px"
|
|
1374
1374
|
},
|
|
1375
1375
|
{
|
|
1376
|
-
key: "
|
|
1377
|
-
label: "
|
|
1376
|
+
key: "toothSize",
|
|
1377
|
+
label: "Tooth size",
|
|
1378
1378
|
description: "Side length of the square crenellations",
|
|
1379
1379
|
type: "number",
|
|
1380
1380
|
min: 1,
|
|
@@ -1623,8 +1623,8 @@ const ANTITANK_WALL = defineControlMeasure({
|
|
|
1623
1623
|
//#region src/generators/cm15-maneuver-areas/attackByFire.ts
|
|
1624
1624
|
const DEFAULT_ATTACK_BY_FIRE_OPTIONS = {
|
|
1625
1625
|
arrowheadWidthRatio: .3,
|
|
1626
|
-
|
|
1627
|
-
|
|
1626
|
+
rearLineLengthRatio: .3,
|
|
1627
|
+
rearLineAngle: 45
|
|
1628
1628
|
};
|
|
1629
1629
|
const ATTACK_BY_FIRE_METADATA = {
|
|
1630
1630
|
id: "attack-by-fire",
|
|
@@ -1655,8 +1655,8 @@ const ATTACK_BY_FIRE_METADATA = {
|
|
|
1655
1655
|
function createAttackByFire(coordinates, options = {}) {
|
|
1656
1656
|
const featureProps = {};
|
|
1657
1657
|
const arrowheadWidthRatio = options.arrowheadWidthRatio ?? DEFAULT_ATTACK_BY_FIRE_OPTIONS.arrowheadWidthRatio;
|
|
1658
|
-
const
|
|
1659
|
-
const
|
|
1658
|
+
const rearLineLengthRatio = options.rearLineLengthRatio ?? DEFAULT_ATTACK_BY_FIRE_OPTIONS.rearLineLengthRatio;
|
|
1659
|
+
const rearLineAngle = options.rearLineAngle ?? DEFAULT_ATTACK_BY_FIRE_OPTIONS.rearLineAngle;
|
|
1660
1660
|
const c1 = coordinates[0];
|
|
1661
1661
|
const c2 = coordinates[1];
|
|
1662
1662
|
const c3 = coordinates[2];
|
|
@@ -1682,13 +1682,13 @@ function createAttackByFire(coordinates, options = {}) {
|
|
|
1682
1682
|
const lenShaft = Math.abs(signedTipDistance);
|
|
1683
1683
|
const lenBase = frame.length;
|
|
1684
1684
|
const dirBase = frame.direction;
|
|
1685
|
-
const angleRad =
|
|
1685
|
+
const angleRad = rearLineAngle * Math.PI / 180;
|
|
1686
1686
|
const baseAngle = -Math.PI / 2;
|
|
1687
1687
|
const angleLeft = baseAngle - angleRad;
|
|
1688
1688
|
const dirBackLeft = [dirBase[0] * Math.cos(angleLeft) - dirBase[1] * Math.sin(angleLeft), dirBase[0] * Math.sin(angleLeft) + dirBase[1] * Math.cos(angleLeft)];
|
|
1689
1689
|
const angleRight = baseAngle + angleRad;
|
|
1690
1690
|
const dirBackRight = [dirBase[0] * Math.cos(angleRight) - dirBase[1] * Math.sin(angleRight), dirBase[0] * Math.sin(angleRight) + dirBase[1] * Math.cos(angleRight)];
|
|
1691
|
-
const backLen = lenBase *
|
|
1691
|
+
const backLen = lenBase * rearLineLengthRatio;
|
|
1692
1692
|
const p2Back = vecAdd(p2, vecScale(dirBackLeft, backLen));
|
|
1693
1693
|
const p3Back = vecAdd(p3, vecScale(dirBackRight, backLen));
|
|
1694
1694
|
const headWidth = lenShaft * arrowheadWidthRatio;
|
|
@@ -1763,8 +1763,8 @@ const ATTACK_BY_FIRE = defineControlMeasure({
|
|
|
1763
1763
|
//#region src/generators/cm15-maneuver-areas/attackHelicopter.ts
|
|
1764
1764
|
const DEFAULT_ATTACK_HELICOPTER_OPTIONS = {
|
|
1765
1765
|
shaftWidthRatio: DEFAULT_SHAFT_WIDTH_RATIO,
|
|
1766
|
-
|
|
1767
|
-
|
|
1766
|
+
smooth: false,
|
|
1767
|
+
smoothResolution: 5,
|
|
1768
1768
|
symbolHeightRatio: .45,
|
|
1769
1769
|
triangleSizeRatio: .25,
|
|
1770
1770
|
bottomBarWidthRatio: 1.5,
|
|
@@ -2729,7 +2729,7 @@ const DEFAULT_SMOOTH_RESOLUTION$5 = 12;
|
|
|
2729
2729
|
const MIN_SMOOTH_RESOLUTION$1 = 2;
|
|
2730
2730
|
const MAX_SMOOTH_RESOLUTION$1 = 64;
|
|
2731
2731
|
const DEFAULT_BLOCK_ARROW_OPTIONS = {
|
|
2732
|
-
|
|
2732
|
+
shaftWidthRatio: .06,
|
|
2733
2733
|
arrowheadStyle: "triangle",
|
|
2734
2734
|
arrowheadWidthRatio: .18,
|
|
2735
2735
|
arrowheadLengthRatio: .22,
|
|
@@ -2751,7 +2751,7 @@ const BLOCK_ARROW_METADATA = {
|
|
|
2751
2751
|
drawRule: "Axis1",
|
|
2752
2752
|
params: [
|
|
2753
2753
|
{
|
|
2754
|
-
key: "
|
|
2754
|
+
key: "shaftWidthRatio",
|
|
2755
2755
|
label: "Shaft width",
|
|
2756
2756
|
description: "Shaft band width as a fraction of the total path length",
|
|
2757
2757
|
type: "number",
|
|
@@ -2844,7 +2844,7 @@ const BLOCK_ARROW_METADATA = {
|
|
|
2844
2844
|
* right side of the shaft.
|
|
2845
2845
|
*/
|
|
2846
2846
|
function createBlockArrow(coordinates, options = {}) {
|
|
2847
|
-
const {
|
|
2847
|
+
const { shaftWidthRatio, arrowheadStyle, arrowheadWidthRatio, arrowheadLengthRatio, smooth, smoothResolution, filled } = {
|
|
2848
2848
|
...DEFAULT_BLOCK_ARROW_OPTIONS,
|
|
2849
2849
|
...options
|
|
2850
2850
|
};
|
|
@@ -2857,7 +2857,7 @@ function createBlockArrow(coordinates, options = {}) {
|
|
|
2857
2857
|
const { pts, pathLength, tip, dir, perp, segLength } = axis;
|
|
2858
2858
|
const requestedHeadLen = axis1.headLength ?? pathLength * arrowheadLengthRatio;
|
|
2859
2859
|
const headLen = Math.min(requestedHeadLen, segLength * .95);
|
|
2860
|
-
const halfShaft = pathLength *
|
|
2860
|
+
const halfShaft = pathLength * shaftWidthRatio / 2;
|
|
2861
2861
|
const halfHead = axis1.headHalfWidth ?? pathLength * arrowheadWidthRatio / 2;
|
|
2862
2862
|
const onAxis = (d, side = 0) => [tip[0] - dir[0] * d + perp[0] * side, tip[1] - dir[1] * d + perp[1] * side];
|
|
2863
2863
|
let shaftEndDist;
|
|
@@ -2956,7 +2956,7 @@ const BLOCK_ARROW = defineControlMeasure({
|
|
|
2956
2956
|
[-1.5, 0],
|
|
2957
2957
|
[.95, .4]
|
|
2958
2958
|
],
|
|
2959
|
-
options: {
|
|
2959
|
+
options: { shaftWidthRatio: .2 }
|
|
2960
2960
|
}
|
|
2961
2961
|
});
|
|
2962
2962
|
function axis1Geometry(coordinates) {
|
|
@@ -4990,7 +4990,7 @@ const BLADE_LENGTH_FRACTION = .8;
|
|
|
4990
4990
|
const DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS = {
|
|
4991
4991
|
arrowheadLengthRatio: .07,
|
|
4992
4992
|
arrowheadWidthRatio: .67,
|
|
4993
|
-
|
|
4993
|
+
bladeHeightRatio: .03
|
|
4994
4994
|
};
|
|
4995
4995
|
const FPF_SHARED = {
|
|
4996
4996
|
entity: "Maneuver Lines",
|
|
@@ -5020,7 +5020,7 @@ const FPF_SHARED = {
|
|
|
5020
5020
|
step: .01
|
|
5021
5021
|
},
|
|
5022
5022
|
{
|
|
5023
|
-
key: "
|
|
5023
|
+
key: "bladeHeightRatio",
|
|
5024
5024
|
label: "Blade height",
|
|
5025
5025
|
description: "Blade's perpendicular reach into the V, as a fraction of its arm's length",
|
|
5026
5026
|
type: "number",
|
|
@@ -5050,7 +5050,7 @@ const FINAL_PROTECTIVE_FIRE_RIGHT_METADATA = {
|
|
|
5050
5050
|
* Builds the filled "blade": a uniform-width rectangle hugging the inside of
|
|
5051
5051
|
* one arm. One long edge lies on the central 80% of the arm line (connected to
|
|
5052
5052
|
* the line); the strip bulges perpendicularly into the inside of the V by
|
|
5053
|
-
* `
|
|
5053
|
+
* `bladeHeightRatio * armLength`.
|
|
5054
5054
|
*
|
|
5055
5055
|
* @param vertex - PT 1, the shared vertex of the V (projected)
|
|
5056
5056
|
* @param tip - the outward tip of the bladed arm (projected)
|
|
@@ -5058,7 +5058,7 @@ const FINAL_PROTECTIVE_FIRE_RIGHT_METADATA = {
|
|
|
5058
5058
|
* be undefined during live single-arm feedback, in which case a default side
|
|
5059
5059
|
* is chosen
|
|
5060
5060
|
*/
|
|
5061
|
-
function bladeRectangle(vertex, tip, otherTip,
|
|
5061
|
+
function bladeRectangle(vertex, tip, otherTip, bladeHeightRatio) {
|
|
5062
5062
|
const v = vecSub(tip, vertex);
|
|
5063
5063
|
const armLength = vecMag(v);
|
|
5064
5064
|
if (armLength < 1e-6) return null;
|
|
@@ -5071,7 +5071,7 @@ function bladeRectangle(vertex, tip, otherTip, bladeHeight) {
|
|
|
5071
5071
|
const gap = (1 - BLADE_LENGTH_FRACTION) / 2;
|
|
5072
5072
|
const onLineNear = vecAdd(vertex, vecScale(dir, armLength * gap));
|
|
5073
5073
|
const onLineFar = vecAdd(vertex, vecScale(dir, armLength * (1 - gap)));
|
|
5074
|
-
const height = vecScale(perp, armLength *
|
|
5074
|
+
const height = vecScale(perp, armLength * bladeHeightRatio);
|
|
5075
5075
|
return [
|
|
5076
5076
|
onLineNear,
|
|
5077
5077
|
onLineFar,
|
|
@@ -5093,7 +5093,7 @@ function bladeRectangle(vertex, tip, otherTip, bladeHeight) {
|
|
|
5093
5093
|
* @param options - Arrowhead and blade sizing parameters
|
|
5094
5094
|
*/
|
|
5095
5095
|
function createFinalProtectiveFire(coordinates, bladedArm, options = {}) {
|
|
5096
|
-
const { arrowheadLengthRatio, arrowheadWidthRatio,
|
|
5096
|
+
const { arrowheadLengthRatio, arrowheadWidthRatio, bladeHeightRatio } = {
|
|
5097
5097
|
...DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS,
|
|
5098
5098
|
...options
|
|
5099
5099
|
};
|
|
@@ -5113,7 +5113,7 @@ function createFinalProtectiveFire(coordinates, bladedArm, options = {}) {
|
|
|
5113
5113
|
const bladeTip = v.tips[bladedArm];
|
|
5114
5114
|
if (bladeTip) {
|
|
5115
5115
|
const otherTip = v.tips[bladedArm === 0 ? 1 : 0];
|
|
5116
|
-
const blade = bladeRectangle(v.vertex, bladeTip, otherTip, Math.max(0,
|
|
5116
|
+
const blade = bladeRectangle(v.vertex, bladeTip, otherTip, Math.max(0, bladeHeightRatio));
|
|
5117
5117
|
if (blade) {
|
|
5118
5118
|
const ring = [...blade, blade[0]].map((c) => unproject(c[0], c[1]));
|
|
5119
5119
|
features.push({
|
|
@@ -5299,14 +5299,14 @@ const FIX = defineControlMeasure({
|
|
|
5299
5299
|
//#region src/generators/cm14-maneuver-lines/flot.ts
|
|
5300
5300
|
const DEFAULT_RADIUS = 50;
|
|
5301
5301
|
const DEFAULT_RADIUS_PIXELS = 10;
|
|
5302
|
-
const
|
|
5302
|
+
const DEFAULT_ARC_SEGMENTS = 16;
|
|
5303
5303
|
/**
|
|
5304
5304
|
* Default options for the FLOT graphic.
|
|
5305
5305
|
*/
|
|
5306
5306
|
const DEFAULT_FLOT_OPTIONS = {
|
|
5307
5307
|
radius: DEFAULT_RADIUS,
|
|
5308
5308
|
radiusPixels: DEFAULT_RADIUS_PIXELS,
|
|
5309
|
-
|
|
5309
|
+
arcSegments: DEFAULT_ARC_SEGMENTS
|
|
5310
5310
|
};
|
|
5311
5311
|
const FLOT_METADATA = {
|
|
5312
5312
|
id: "flot",
|
|
@@ -5341,8 +5341,8 @@ const FLOT_METADATA = {
|
|
|
5341
5341
|
unit: "m"
|
|
5342
5342
|
},
|
|
5343
5343
|
{
|
|
5344
|
-
key: "
|
|
5345
|
-
label: "
|
|
5344
|
+
key: "arcSegments",
|
|
5345
|
+
label: "Arc segments",
|
|
5346
5346
|
description: "Number of points used to render each semicircle",
|
|
5347
5347
|
type: "number",
|
|
5348
5348
|
min: 4,
|
|
@@ -5362,16 +5362,16 @@ const FLOT_METADATA = {
|
|
|
5362
5362
|
* @param segmentDir - Direction vector of the segment (normalized)
|
|
5363
5363
|
* @param perpDir - Perpendicular direction vector (normalized)
|
|
5364
5364
|
* @param radius - Radius of the semicircle
|
|
5365
|
-
* @param
|
|
5365
|
+
* @param arcSegments - Number of points in the arc
|
|
5366
5366
|
* @param includeStart - Whether to include the start point
|
|
5367
5367
|
* @returns Array of arc points forming a true semicircle
|
|
5368
5368
|
*/
|
|
5369
|
-
function generateArcPoints(startPoint, segmentDir, perpDir, radius,
|
|
5369
|
+
function generateArcPoints(startPoint, segmentDir, perpDir, radius, arcSegments, includeStart) {
|
|
5370
5370
|
const points = [];
|
|
5371
5371
|
const startIndex = includeStart ? 0 : 1;
|
|
5372
5372
|
const center = vecAdd(startPoint, vecScale(segmentDir, radius));
|
|
5373
|
-
for (let i = startIndex; i <=
|
|
5374
|
-
const t = i /
|
|
5373
|
+
for (let i = startIndex; i <= arcSegments; i++) {
|
|
5374
|
+
const t = i / arcSegments;
|
|
5375
5375
|
const angle = Math.PI * (1 - t);
|
|
5376
5376
|
const alongSegment = Math.cos(angle) * radius;
|
|
5377
5377
|
const perpOffset = Math.sin(angle) * radius;
|
|
@@ -5386,11 +5386,11 @@ function generateArcPoints(startPoint, segmentDir, perpDir, radius, resolution,
|
|
|
5386
5386
|
* @param p1 - Start position (projected)
|
|
5387
5387
|
* @param p2 - End position (projected)
|
|
5388
5388
|
* @param radius - Radius of each semicircle
|
|
5389
|
-
* @param
|
|
5389
|
+
* @param arcSegments - Points per arc
|
|
5390
5390
|
* @param isFirstSegment - Whether this is the first segment (include start point)
|
|
5391
5391
|
* @returns Array of points forming the scalloped line for this segment
|
|
5392
5392
|
*/
|
|
5393
|
-
function processSegment(p1, p2, radius,
|
|
5393
|
+
function processSegment(p1, p2, radius, arcSegments, isFirstSegment) {
|
|
5394
5394
|
const segmentVec = vecSub(p2, p1);
|
|
5395
5395
|
const segmentLength = vecMag(segmentVec);
|
|
5396
5396
|
if (segmentLength < 1e-6) return isFirstSegment ? [p1] : [];
|
|
@@ -5402,14 +5402,14 @@ function processSegment(p1, p2, radius, resolution, isFirstSegment) {
|
|
|
5402
5402
|
const remainingLength = segmentLength - numFullArcs * diameter;
|
|
5403
5403
|
let currentPos = p1;
|
|
5404
5404
|
for (let arcIndex = 0; arcIndex < numFullArcs; arcIndex++) {
|
|
5405
|
-
const arcPoints = generateArcPoints(currentPos, segmentDir, perpDir, radius,
|
|
5405
|
+
const arcPoints = generateArcPoints(currentPos, segmentDir, perpDir, radius, arcSegments, arcIndex === 0 && isFirstSegment);
|
|
5406
5406
|
points.push(...arcPoints);
|
|
5407
5407
|
currentPos = vecAdd(currentPos, vecScale(segmentDir, diameter));
|
|
5408
5408
|
}
|
|
5409
5409
|
if (remainingLength > diameter * .1) {
|
|
5410
5410
|
const partialRadius = remainingLength / 2;
|
|
5411
|
-
const
|
|
5412
|
-
const arcPoints = generateArcPoints(currentPos, segmentDir, perpDir, partialRadius,
|
|
5411
|
+
const partialArcSegments = Math.max(3, Math.round(arcSegments * (partialRadius / radius)));
|
|
5412
|
+
const arcPoints = generateArcPoints(currentPos, segmentDir, perpDir, partialRadius, partialArcSegments, numFullArcs === 0 && isFirstSegment);
|
|
5413
5413
|
points.push(...arcPoints);
|
|
5414
5414
|
}
|
|
5415
5415
|
return points;
|
|
@@ -5429,22 +5429,22 @@ function processSegment(p1, p2, radius, resolution, isFirstSegment) {
|
|
|
5429
5429
|
* ```typescript
|
|
5430
5430
|
* const flot = createFLOT(
|
|
5431
5431
|
* [[-122.4194, 37.7749], [-122.4100, 37.7800], [-122.4000, 37.7750]],
|
|
5432
|
-
* { radius: 100,
|
|
5432
|
+
* { radius: 100, arcSegments: 20 }
|
|
5433
5433
|
* );
|
|
5434
5434
|
* ```
|
|
5435
5435
|
*/
|
|
5436
5436
|
function createFLOT(positions, options = {}) {
|
|
5437
|
-
const { radius = DEFAULT_RADIUS, radiusPixels, metersPerPixel,
|
|
5437
|
+
const { radius = DEFAULT_RADIUS, radiusPixels, metersPerPixel, arcSegments = DEFAULT_ARC_SEGMENTS } = options;
|
|
5438
5438
|
let effectiveRadius = radius;
|
|
5439
5439
|
if (radiusPixels !== void 0 && metersPerPixel !== void 0 && metersPerPixel > 0) effectiveRadius = radiusPixels * metersPerPixel;
|
|
5440
5440
|
const safeRadius = Math.max(EPSILON, effectiveRadius);
|
|
5441
|
-
const
|
|
5441
|
+
const safeArcSegments = Math.max(3, Math.round(arcSegments));
|
|
5442
5442
|
const projectedPoints = positions.map((p) => project(p[0], p[1]));
|
|
5443
5443
|
const allPoints = [];
|
|
5444
5444
|
for (let i = 0; i < projectedPoints.length - 1; i++) {
|
|
5445
5445
|
const p1 = projectedPoints[i];
|
|
5446
5446
|
const p2 = projectedPoints[i + 1];
|
|
5447
|
-
const segmentPoints = processSegment(p1, p2, safeRadius,
|
|
5447
|
+
const segmentPoints = processSegment(p1, p2, safeRadius, safeArcSegments, i === 0);
|
|
5448
5448
|
allPoints.push(...segmentPoints);
|
|
5449
5449
|
}
|
|
5450
5450
|
if (allPoints.length > 0 && projectedPoints.length > 1) {
|
|
@@ -5473,15 +5473,15 @@ const FLOT = defineControlMeasure({
|
|
|
5473
5473
|
});
|
|
5474
5474
|
//#endregion
|
|
5475
5475
|
//#region src/generators/cm29-protection-lines/fortifiedLine.ts
|
|
5476
|
-
const
|
|
5477
|
-
const
|
|
5476
|
+
const DEFAULT_TOOTH_SIZE = 50;
|
|
5477
|
+
const DEFAULT_TOOTH_SIZE_PIXELS = 10;
|
|
5478
5478
|
const DEFAULT_SMOOTH_RESOLUTION$1 = 16;
|
|
5479
5479
|
/**
|
|
5480
5480
|
* Default options for the Fortified Line graphic.
|
|
5481
5481
|
*/
|
|
5482
5482
|
const DEFAULT_FORTIFIED_LINE_OPTIONS = {
|
|
5483
|
-
|
|
5484
|
-
|
|
5483
|
+
toothSize: DEFAULT_TOOTH_SIZE,
|
|
5484
|
+
toothSizePixels: DEFAULT_TOOTH_SIZE_PIXELS,
|
|
5485
5485
|
smooth: false,
|
|
5486
5486
|
smoothResolution: DEFAULT_SMOOTH_RESOLUTION$1
|
|
5487
5487
|
};
|
|
@@ -5571,9 +5571,9 @@ function processFortifiedSegment(p1, p2, size, isFirstSegment) {
|
|
|
5571
5571
|
* Calculates the effective size based on options and projection.
|
|
5572
5572
|
*/
|
|
5573
5573
|
function calculateEffectiveSize(options) {
|
|
5574
|
-
const {
|
|
5575
|
-
let effectiveSize =
|
|
5576
|
-
if (
|
|
5574
|
+
const { toothSize = DEFAULT_TOOTH_SIZE, toothSizePixels, metersPerPixel } = options;
|
|
5575
|
+
let effectiveSize = toothSize;
|
|
5576
|
+
if (toothSizePixels !== void 0 && metersPerPixel !== void 0 && metersPerPixel > 0) effectiveSize = toothSizePixels * metersPerPixel;
|
|
5577
5577
|
return Math.max(EPSILON, effectiveSize);
|
|
5578
5578
|
}
|
|
5579
5579
|
/**
|
|
@@ -5825,8 +5825,8 @@ const ISOLATE = defineControlMeasure({
|
|
|
5825
5825
|
//#region src/generators/cm15-maneuver-areas/mainAttack.ts
|
|
5826
5826
|
const DEFAULT_MAIN_ATTACK_OPTIONS = {
|
|
5827
5827
|
shaftWidthRatio: DEFAULT_SHAFT_WIDTH_RATIO,
|
|
5828
|
-
|
|
5829
|
-
|
|
5828
|
+
smooth: false,
|
|
5829
|
+
smoothResolution: 5
|
|
5830
5830
|
};
|
|
5831
5831
|
const MAIN_ATTACK_METADATA = {
|
|
5832
5832
|
id: "main-attack",
|
|
@@ -6731,8 +6731,8 @@ const STRONG_POINT = defineControlMeasure({
|
|
|
6731
6731
|
//#region src/generators/cm15-maneuver-areas/supportByFire.ts
|
|
6732
6732
|
const DEFAULT_SUPPORT_BY_FIRE_OPTIONS = {
|
|
6733
6733
|
arrowheadWidthRatio: .3,
|
|
6734
|
-
|
|
6735
|
-
|
|
6734
|
+
rearLineLengthRatio: .3,
|
|
6735
|
+
rearLineAngle: 45
|
|
6736
6736
|
};
|
|
6737
6737
|
const SUPPORT_BY_FIRE_METADATA = {
|
|
6738
6738
|
id: "support-by-fire",
|
|
@@ -6759,8 +6759,8 @@ const SUPPORT_BY_FIRE_METADATA = {
|
|
|
6759
6759
|
function createSupportByFire(coordinates, options = {}) {
|
|
6760
6760
|
const featureProps = {};
|
|
6761
6761
|
const arrowheadWidthRatio = options.arrowheadWidthRatio ?? DEFAULT_SUPPORT_BY_FIRE_OPTIONS.arrowheadWidthRatio;
|
|
6762
|
-
const
|
|
6763
|
-
const
|
|
6762
|
+
const rearLineLengthRatio = options.rearLineLengthRatio ?? DEFAULT_SUPPORT_BY_FIRE_OPTIONS.rearLineLengthRatio;
|
|
6763
|
+
const rearLineAngle = options.rearLineAngle ?? DEFAULT_SUPPORT_BY_FIRE_OPTIONS.rearLineAngle;
|
|
6764
6764
|
const c1 = coordinates[0];
|
|
6765
6765
|
const c2 = coordinates[1];
|
|
6766
6766
|
const c3 = coordinates[2];
|
|
@@ -6776,13 +6776,13 @@ function createSupportByFire(coordinates, options = {}) {
|
|
|
6776
6776
|
type: "FeatureCollection",
|
|
6777
6777
|
features: []
|
|
6778
6778
|
};
|
|
6779
|
-
const angleRad =
|
|
6779
|
+
const angleRad = rearLineAngle * Math.PI / 180;
|
|
6780
6780
|
const baseAngle = -Math.PI / 2;
|
|
6781
6781
|
const angleLeft = baseAngle - angleRad;
|
|
6782
6782
|
const dirBackLeft = [dirBase[0] * Math.cos(angleLeft) - dirBase[1] * Math.sin(angleLeft), dirBase[0] * Math.sin(angleLeft) + dirBase[1] * Math.cos(angleLeft)];
|
|
6783
6783
|
const angleRight = baseAngle + angleRad;
|
|
6784
6784
|
const dirBackRight = [dirBase[0] * Math.cos(angleRight) - dirBase[1] * Math.sin(angleRight), dirBase[0] * Math.sin(angleRight) + dirBase[1] * Math.cos(angleRight)];
|
|
6785
|
-
const backLen = lenBase *
|
|
6785
|
+
const backLen = lenBase * rearLineLengthRatio;
|
|
6786
6786
|
const p1Back = vecAdd(p1, vecScale(dirBackLeft, backLen));
|
|
6787
6787
|
const p2Back = vecAdd(p2, vecScale(dirBackRight, backLen));
|
|
6788
6788
|
const vLeft = vecSub(p3, p1);
|
|
@@ -6877,8 +6877,8 @@ const SUPPORT_BY_FIRE = defineControlMeasure({
|
|
|
6877
6877
|
//#region src/generators/cm15-maneuver-areas/supportingAttack.ts
|
|
6878
6878
|
const DEFAULT_SUPPORTING_ATTACK_OPTIONS = {
|
|
6879
6879
|
shaftWidthRatio: DEFAULT_SHAFT_WIDTH_RATIO,
|
|
6880
|
-
|
|
6881
|
-
|
|
6880
|
+
smooth: false,
|
|
6881
|
+
smoothResolution: 5
|
|
6882
6882
|
};
|
|
6883
6883
|
const SUPPORTING_ATTACK_METADATA = {
|
|
6884
6884
|
id: "supporting-attack",
|
|
@@ -7321,4 +7321,4 @@ function assertNever(value) {
|
|
|
7321
7321
|
throw new Error(`Unhandled control measure kind: ${String(value)}`);
|
|
7322
7322
|
}
|
|
7323
7323
|
//#endregion
|
|
7324
|
-
export {
|
|
7324
|
+
export { turnDrawRule as $, DEFAULT_GENERIC_POLYGON_OPTIONS as A, DEFAULT_BLOCK_OPTIONS as B, DEFAULT_FIX_OPTIONS as C, DEFAULT_DELAY_OPTIONS as D, DEFAULT_DISRUPT_OPTIONS as E, DEFAULT_BYPASS_OPTIONS as F, DEFAULT_ANTITANK_DITCH_OPTIONS as G, DEFAULT_ATTACK_HELICOPTER_OPTIONS as H, DEFAULT_BREACH_OPTIONS as I, rectangleDrawRule as J, DEFAULT_AMBUSH_OPTIONS as K, DEFAULT_BLOCK_MISSION_TASK_OPTIONS as L, DEFAULT_GENERIC_CIRCLE_OPTIONS as M, DEFAULT_CLASSIC_ARROW_OPTIONS as N, DEFAULT_CLEAR_OPTIONS as O, DEFAULT_CANALIZE_OPTIONS as P, line23DrawRule as Q, DEFAULT_BOUNDARY_OPTIONS as R, DEFAULT_FLOT_OPTIONS as S, DEFAULT_ENCIRCLEMENT_OPTIONS as T, DEFAULT_ATTACK_BY_FIRE_OPTIONS as U, DEFAULT_BATTLE_POSITION_OPTIONS as V, DEFAULT_ANTITANK_WALL_OPTIONS as W, supportByFireDrawRule as X, axis1DrawRule as Y, line24DrawRule as Z, DEFAULT_OBSTACLE_BYPASS_EASY_OPTIONS as _, EPSILON as _t, DEFINITIONS as a, disruptDrawRule as at, DEFAULT_FORTIFIED_AREA_OPTIONS as b, getDefaultOptions as c, createMidpointPerpendicularDrawRule as ct, DEFAULT_SUPPORTING_ATTACK_OPTIONS as d, snapToMidpointPerpendicular as dt, line1DrawRule as et, DEFAULT_SUPPORT_BY_FIRE_OPTIONS as f, createBaselineFrame as ft, DEFAULT_OBSTACLE_BYPASS_IMPOSSIBLE_OPTIONS as g, unproject as gt, DEFAULT_PRINCIPAL_DIRECTION_OF_FIRE_OPTIONS as h, project as ht, CONTROL_MEASURE_METADATA as i, centerRadiusDrawRule as it, DEFAULT_GENERIC_LINE_OPTIONS as j, DEFAULT_GENERIC_RECTANGLE_OPTIONS as k, listControlMeasureMetadata as l, getMidpointPerpendicularSignedDistance as lt, DEFAULT_TACTICAL_ARROW_OPTIONS as m, computeInitialWidthPoint as mt, resolveStyleHints as n, attackByFireDrawRule as nt, getControlMeasureMetadata as o, blockDrawRule as ot, DEFAULT_STRONG_POINT_OPTIONS as p, calculateMetrics as pt, DEFAULT_AIRBORNE_ATTACK_OPTIONS as q, CONTROL_MEASURE_IDS as r, point12DrawRule as rt, getControlMeasureMetadataByValue as s, computeDefaultMidpointPerpendicularPoint as st, renderControlMeasure as t, ambushDrawRule as tt, DEFAULT_TURN_OPTIONS as u, pointOnMidpointPerpendicularAxis as ut, DEFAULT_OBSTACLE_BYPASS_DIFFICULT_OPTIONS as v, getMetersPerPixel as vt, DEFAULT_FINAL_PROTECTIVE_FIRE_OPTIONS as w, DEFAULT_FORTIFIED_LINE_OPTIONS as x, DEFAULT_MAIN_ATTACK_OPTIONS as y, roundToFixed as yt, DEFAULT_BLOCK_ARROW_OPTIONS as z };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Battle Position"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Battle Position"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M21.43 34.89 L23.39 35.66 L25.90 36.34 L28.87 36.91 L32.23 37.38 L35.90 37.74 L39.25 37.96" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M52.61 38.14 L56.20 38.00 L60.10 37.74 L63.77 37.38 L67.13 36.91 L70.10 36.34 L72.61 35.66 L74.57 34.89 L76.12 33.91 L77.47 32.66 L78.61 31.17 L79.55 29.49 L80.27 27.66 L80.79 25.70 L81.10 23.67 L81.21 21.60 L81.10 19.54 L80.79 17.51 L80.27 15.55 L79.54 13.72 L78.61 12.03 L77.47 10.55 L76.12 9.30 L74.57 8.32 L72.61 7.55 L70.10 6.87 L67.13 6.30 L63.77 5.83 L60.10 5.47 L56.20 5.21 L52.14 5.05 L48.00 5.00 L43.86 5.05 L39.80 5.21 L35.90 5.47 L32.23 5.83 L28.87 6.30 L25.90 6.87 L23.39 7.55 L21.43 8.32 L19.88 9.30 L18.53 10.55 L17.39 12.03 L16.46 13.72 L15.73 15.55 L15.21 17.51 L14.90 19.54 L14.79 21.60 L14.90 23.67 L15.21 25.70 L15.73 27.66 L16.46 29.49 L17.39 31.17 L18.53 32.66 L19.88 33.91 L21.43 34.89" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M42.17 33.36 L42.05 42.90" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M49.81 33.46 L49.69 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/></svg>
|
package/media/circle.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Circle"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M67.00 24.00 L66.91 22.14 L66.63 20.30 L66.18 18.49 L65.56 16.73 L64.76 15.04 L63.80 13.45 L62.69 11.94 L61.43 10.57 L60.06 9.31 L58.55 8.20 L56.96 7.24 L55.27 6.44 L53.51 5.82 L51.70 5.37 L49.86 5.09 L48.00 5.00 L46.14 5.09 L44.30 5.37 L42.49 5.82 L40.73 6.44 L39.04 7.24 L37.45 8.20 L35.94 9.31 L34.57 10.57 L33.31 11.94 L32.20 13.45 L31.24 15.04 L30.44 16.73 L29.82 18.49 L29.37 20.30 L29.09 22.14 L29.00 24.00 L29.09 25.86 L29.37 27.71 L29.82 29.51 L30.44 31.27 L31.24 32.96 L32.20 34.55 L33.31 36.06 L34.57 37.43 L35.94 38.69 L37.45 39.80 L39.04 40.76 L40.73 41.56 L42.49 42.18 L44.30 42.63 L46.14 42.91 L48.00 43.00 L49.86 42.91 L51.70 42.63 L53.51 42.18 L55.27 41.56 L56.96 40.76 L58.55 39.80 L60.06 38.69 L61.43 37.43 L62.69 36.06 L63.80 34.55 L64.76 32.96 L65.56 31.27 L66.18 29.51 L66.63 27.71 L66.91 25.86 L67.00 24.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Encirclement"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M30.33 32.84 L30.69 33.55 L31.12 34.20 L31.61 34.79 L32.15 35.33 L32.74 35.83 L33.37 36.27 L34.04 36.67 L34.75 37.03 L35.48 37.36 L36.23 37.66 L37.00 37.93 L37.78 38.18 L38.57 38.41 L39.37 38.62 L40.15 38.83 L40.93 39.02 L41.72 39.20 L42.55 39.36 L43.41 39.49 L44.30 39.60 L45.21 39.68 L46.13 39.74 L47.06 39.78 L48.00 39.79 L48.94 39.78 L49.87 39.74 L50.79 39.68 L51.70 39.60 L52.59 39.49 L53.45 39.36 L54.28 39.20 L55.07 39.02 L55.85 38.83 L56.63 38.62 L57.43 38.41 L58.22 38.18 L59.00 37.93 L59.77 37.66 L60.52 37.36 L61.25 37.03 L61.96 36.67 L62.63 36.27 L63.26 35.83 L63.85 35.33 L64.39 34.79 L64.88 34.20 L65.31 33.55 L65.67 32.84 L65.98 32.03 L66.25 31.10 L66.48 30.07 L66.66 28.95 L66.81 27.77 L66.92 26.54 L66.98 25.28 L67.00 24.00 L66.98 22.72 L66.92 21.46 L66.81 20.23 L66.66 19.05 L66.48 17.93 L66.25 16.90 L65.98 15.97 L65.67 15.16 L65.31 14.45 L64.88 13.80 L64.39 13.21 L63.85 12.67 L63.26 12.17 L62.63 11.73 L61.96 11.33 L61.25 10.97 L60.52 10.64 L59.77 10.34 L59.00 10.07 L58.22 9.82 L57.43 9.59 L56.63 9.38 L55.85 9.17 L55.07 8.98 L54.28 8.80 L53.45 8.64 L52.59 8.51 L51.70 8.40 L50.79 8.32 L49.87 8.26 L48.94 8.22 L48.00 8.21 L47.06 8.22 L46.13 8.26 L45.21 8.32 L44.30 8.40 L43.41 8.51 L42.55 8.64 L41.72 8.80 L40.93 8.98 L40.15 9.17 L39.37 9.38 L38.57 9.59 L37.78 9.82 L37.00 10.07 L36.23 10.34 L35.48 10.64 L34.75 10.97 L34.04 11.33 L33.37 11.73 L32.74 12.17 L32.15 12.67 L31.61 13.21 L31.12 13.80 L30.69 14.45 L30.33 15.16 L30.02 15.97 L29.75 16.90 L29.52 17.93 L29.34 19.05 L29.19 20.23 L29.08 21.46 L29.02 22.72 L29.00 24.00 L29.02 25.28 L29.08 26.54 L29.19 27.77 L29.34 28.95 L29.52 30.07 L29.75 31.10 L30.02 32.03 L30.33 32.84 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/><path d="M29.81 31.29 L27.43 34.32 L31.15 34.24" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M34.18 36.74 L34.45 40.46 L37.18 37.98" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M40.99 39.03 L42.09 42.58 L44.20 39.59" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M48.15 39.79 L49.90 43.00 L51.40 39.63" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M55.29 38.96 L57.72 41.70 L58.43 38.11" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M62.08 36.60 L65.51 38.19 L64.59 34.55" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M66.27 31.01 L69.80 29.95 L66.81 27.80" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M66.99 23.85 L70.20 22.07 L66.84 20.60" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M66.19 16.71 L68.57 13.68 L64.85 13.76" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M61.82 11.26 L61.55 7.54 L58.82 10.02" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M55.01 8.97 L53.91 5.42 L51.80 8.41" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M47.85 8.21 L46.10 5.00 L44.60 8.37" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M40.71 9.04 L38.28 6.30 L37.57 9.89" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M33.92 11.40 L30.49 9.81 L31.41 13.45" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M29.73 16.99 L26.20 18.05 L29.19 20.20" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M29.01 24.15 L25.80 25.93 L29.16 27.40" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/></svg>
|
package/media/line.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Line"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M5.78 43.00 L48.00 5.00 L90.22 34.56" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Polygon"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M23.93 43.00 L67.00 40.47 L72.07 12.60 L36.60 5.00 L23.93 43.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Rectangle"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M16.91 43.00 L79.09 43.00 L79.09 5.00 L16.91 5.00 L16.91 43.00 Z" fill="#1e293b" fill-opacity="0" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 48" width="96" height="48" role="img" aria-label="Strong Point"><rect width="96" height="48" rx="6" fill="#f8fafc" stroke="#e2e8f0"/><path d="M28.58 33.73 L30.01 34.29 L31.84 34.78 L34.00 35.20 L36.45 35.54 L39.13 35.81 L41.58 35.97" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M51.31 36.10 L53.93 36.00 L56.78 35.81 L59.45 35.54 L61.90 35.20 L64.07 34.78 L65.89 34.29 L67.32 33.73 L68.45 33.01 L69.44 32.10 L70.27 31.02 L70.95 29.79 L71.48 28.45 L71.86 27.03 L72.08 25.55 L72.16 24.04 L72.08 22.54 L71.86 21.06 L71.48 19.63 L70.95 18.29 L70.27 17.07 L69.44 15.99 L68.45 15.07 L67.32 14.36 L65.89 13.79 L64.07 13.30 L61.90 12.88 L59.45 12.54 L56.78 12.28 L53.93 12.09 L50.97 11.98 L47.95 11.94 L44.93 11.98 L41.97 12.09 L39.13 12.28 L36.45 12.54 L34.00 12.88 L31.84 13.30 L30.01 13.79 L28.58 14.36 L27.45 15.07 L26.46 15.99 L25.63 17.07 L24.95 18.29 L24.42 19.63 L24.04 21.06 L23.82 22.54 L23.74 24.04 L23.82 25.55 L24.04 27.03 L24.42 28.45 L24.95 29.79 L25.63 31.02 L26.46 32.10 L27.45 33.01 L28.58 33.73" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M31.89 34.80 L30.57 41.63" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M38.78 35.77 L38.09 42.70" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M52.68 36.04 L52.95 43.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M59.62 35.52 L60.58 42.41" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M66.41 34.09 L68.98 40.56" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M71.15 29.30 L77.62 31.86" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M72.08 22.47 L78.96 21.42" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M69.53 16.11 L75.05 11.86" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M63.38 13.17 L64.70 6.33" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M56.49 12.26 L56.95 5.31" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M49.54 11.96 L49.62 5.00" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M42.58 12.07 L42.31 5.11" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M35.65 12.65 L34.69 5.76" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M28.89 14.23 L26.32 7.77" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M24.52 19.39 L18.05 16.83" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M23.92 26.25 L17.04 27.30" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M26.82 32.43 L22.09 37.53" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M43.70 32.61 L43.62 39.57" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/><path d="M49.27 32.68 L49.18 39.64" fill="none" stroke="#1e293b" stroke-width="1.25" stroke-linejoin="round" stroke-linecap="round"/></svg>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orbat-mapper/control-measures",
|
|
3
|
-
"version": "0.2.0-alpha.
|
|
3
|
+
"version": "0.2.0-alpha.8",
|
|
4
4
|
"description": "Library for drawing tactical graphics and control measures according to MIL-STD-2525 and APP-6 standards.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Orbat Mapper",
|