Added Bresenham line algorithm for one octant

This commit is contained in:
Arnaut 2021-05-12 19:13:17 +02:00
commit 4b1e5b8a2b
3 changed files with 68 additions and 0 deletions

View file

@ -217,6 +217,32 @@ public class Shape
position = int2.zero;
return false;
}
// Set every cell on the line from a to b to true according to Bresenham's Line Algorithm
public void SetLine(float2 a, float2 b)
{
float dx = b.x - a.x;
float dy = b.y - a.y;
float derr = Math.Abs(dy / dx); // dx != 0
float error = 0f;
int y = (int) Math.Round(a.y);
for (int x = (int) Math.Round(a.x); x <= (int) Math.Round(b.x); x++)
{
if (x < Width && y < Height)
{
Cells[x, y] = true;
}
error += derr;
if (error >= 0.5f)
{
y += Math.Sign(dy);
error -= 1f;
}
}
}
}
[MessagePackObject, JsonObject(MemberSerialization.OptIn), JsonConverter(typeof(JsonKnownTypesConverter<ItemData>))]

View file

@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using NUnit.Framework;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Unity.Mathematics;
class BresenhamTest
{
[Test]
public void ShapeTest()
{
Shape shape = new Shape(14, 6);
Console.WriteLine("test");
shape.SetLine(new float2(0.6f, 0.6f), new float2(10.6f, 4.6f));
var coords = new[] { (1, 1), (2, 1), (3, 2), (4, 2), (5, 3), (6, 3), (7, 3), (8, 4), (9, 4), (10, 5), (11, 5)};
foreach(var coord in coords)
{
Assert.True(shape.Cells[coord.Item1, coord.Item2], $"{coord.Item1}, {coord.Item2}");
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 108b8cc35b87da84c8671ee8f9386799
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: