Added alternating diagonals map measurement
This commit is contained in:
parent
c338af5557
commit
4c301604fc
@ -77,9 +77,11 @@ function MapMeasure({ map, selectedToolSettings, active, gridSize }) {
|
|||||||
brushPosition,
|
brushPosition,
|
||||||
gridSize
|
gridSize
|
||||||
);
|
);
|
||||||
|
// Round the grid positions to the nearest 0.1 to aviod floating point issues
|
||||||
|
const precision = { x: 0.1, y: 0.1 };
|
||||||
const length = Vector2.distance(
|
const length = Vector2.distance(
|
||||||
Vector2.divide(points[0], gridSize),
|
Vector2.roundTo(Vector2.divide(points[0], gridSize), precision),
|
||||||
Vector2.divide(points[1], gridSize),
|
Vector2.roundTo(Vector2.divide(points[1], gridSize), precision),
|
||||||
selectedToolSettings.type
|
selectedToolSettings.type
|
||||||
);
|
);
|
||||||
setDrawingShapeData({
|
setDrawingShapeData({
|
||||||
|
@ -5,6 +5,7 @@ import ToolSection from "./ToolSection";
|
|||||||
import MeasureChebyshevIcon from "../../../icons/MeasureChebyshevIcon";
|
import MeasureChebyshevIcon from "../../../icons/MeasureChebyshevIcon";
|
||||||
import MeasureEuclideanIcon from "../../../icons/MeasureEuclideanIcon";
|
import MeasureEuclideanIcon from "../../../icons/MeasureEuclideanIcon";
|
||||||
import MeasureManhattanIcon from "../../../icons/MeasureManhattanIcon";
|
import MeasureManhattanIcon from "../../../icons/MeasureManhattanIcon";
|
||||||
|
import MeasureAlternatingIcon from "../../../icons/MeasureAlternatingIcon";
|
||||||
|
|
||||||
import Divider from "../../Divider";
|
import Divider from "../../Divider";
|
||||||
|
|
||||||
@ -19,6 +20,8 @@ function MeasureToolSettings({ settings, onSettingChange }) {
|
|||||||
onSettingChange({ type: "euclidean" });
|
onSettingChange({ type: "euclidean" });
|
||||||
} else if (key === "c") {
|
} else if (key === "c") {
|
||||||
onSettingChange({ type: "manhattan" });
|
onSettingChange({ type: "manhattan" });
|
||||||
|
} else if (key === "a") {
|
||||||
|
onSettingChange({ type: "alternating" });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,6 +34,12 @@ function MeasureToolSettings({ settings, onSettingChange }) {
|
|||||||
isSelected: settings.type === "chebyshev",
|
isSelected: settings.type === "chebyshev",
|
||||||
icon: <MeasureChebyshevIcon />,
|
icon: <MeasureChebyshevIcon />,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: "alternating",
|
||||||
|
title: "Alternating Diagonal Distance (A)",
|
||||||
|
isSelected: settings.type === "alternating",
|
||||||
|
icon: <MeasureAlternatingIcon />,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: "euclidean",
|
id: "euclidean",
|
||||||
title: "Line Distance (L)",
|
title: "Line Distance (L)",
|
||||||
|
@ -363,7 +363,7 @@ export function compare(a, b, threshold) {
|
|||||||
* Returns the distance between two vectors
|
* Returns the distance between two vectors
|
||||||
* @param {Vector2} a
|
* @param {Vector2} a
|
||||||
* @param {Vector2} b
|
* @param {Vector2} b
|
||||||
* @param {string} type - `chebyshev | euclidean | manhattan`
|
* @param {string} type - `chebyshev | euclidean | manhattan | alternating`
|
||||||
*/
|
*/
|
||||||
export function distance(a, b, type) {
|
export function distance(a, b, type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
@ -373,6 +373,12 @@ export function distance(a, b, type) {
|
|||||||
return length(subtract(a, b));
|
return length(subtract(a, b));
|
||||||
case "manhattan":
|
case "manhattan":
|
||||||
return Math.abs(a.x - b.x) + Math.abs(a.y - b.y);
|
return Math.abs(a.x - b.x) + Math.abs(a.y - b.y);
|
||||||
|
case "alternating":
|
||||||
|
// Alternating diagonal distance like D&D 3.5 and Pathfinder
|
||||||
|
const delta = abs(subtract(a, b));
|
||||||
|
const ma = max(delta);
|
||||||
|
const mi = min(delta);
|
||||||
|
return ma - mi + Math.floor(1.5 * mi);
|
||||||
default:
|
default:
|
||||||
return length(subtract(a, b));
|
return length(subtract(a, b));
|
||||||
}
|
}
|
||||||
|
18
src/icons/MeasureAlternatingIcon.js
Normal file
18
src/icons/MeasureAlternatingIcon.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
function MeasureAlternatingIcon() {
|
||||||
|
return (
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="24"
|
||||||
|
fill="currentcolor"
|
||||||
|
>
|
||||||
|
<path d="M0 0h24v24H0z" fill="none" />
|
||||||
|
<path d="M15.54 4.93a2.5 2.5 0 1 1 .85 4.1l-.94.94a4 4 0 0 1-5.48 5.48l-.95.94a2.5 2.5 0 1 1-1.41-1.41l.94-.95a4 4 0 0 1 5.48-5.48l.95-.94a2.5 2.5 0 0 1 .56-2.68z" />
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default MeasureAlternatingIcon;
|
Loading…
Reference in New Issue
Block a user