rust/integral-geometry/src/lib.rs
author unc0rr
Mon, 05 Nov 2018 21:36:28 +0100
changeset 14139 37c99587825d
parent 14137 3119d665d3c6
child 14140 3078123e84ea
permissions -rw-r--r--
Implement BeizerCurveSegments, no tests
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14139
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
     1
#[macro_use]
14081
5d42204ac35e Start convertion of FindPoint()
unC0Rr
parents: 14078
diff changeset
     2
extern crate fpnum;
5d42204ac35e Start convertion of FindPoint()
unC0Rr
parents: 14078
diff changeset
     3
14139
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
     4
use fpnum::{distance, FPNum, FPPoint};
14134
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
     5
use std::{
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
     6
    cmp::max,
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
     7
    ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Range, RangeInclusive, Sub, SubAssign}
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
     8
};
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
     9
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    10
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    11
pub struct Point {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    12
    pub x: i32,
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    13
    pub y: i32,
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    14
}
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    15
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    16
impl Point {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    17
    #[inline]
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    18
    pub fn new(x: i32, y: i32) -> Self {
13941
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
    19
        Self { x, y }
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    20
    }
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    21
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    22
    #[inline]
14131
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    23
    pub fn diag(v: i32) -> Self {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    24
        Self::new(v, v)
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    25
    }
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    26
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    27
    #[inline]
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    28
    pub fn zero() -> Self {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    29
        Self::new(0, 0)
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    30
    }
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    31
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    32
    #[inline]
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    33
    pub fn signum(self) -> Self {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    34
        Self::new(self.x.signum(), self.y.signum())
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    35
    }
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    36
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    37
    #[inline]
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    38
    pub fn abs(self) -> Self {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    39
        Self::new(self.x.abs(), self.y.abs())
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    40
    }
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    41
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    42
    #[inline]
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    43
    pub fn dot(self, other: Point) -> i32 {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    44
        self.x * other.x + self.y * other.y
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    45
    }
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    46
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    47
    #[inline]
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    48
    pub fn max_norm(self) -> i32 {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    49
        std::cmp::max(self.x.abs(), self.y.abs())
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
    50
    }
14031
c47283feafac add circle filling to land2d
alfadur
parents: 13950
diff changeset
    51
c47283feafac add circle filling to land2d
alfadur
parents: 13950
diff changeset
    52
    #[inline]
14081
5d42204ac35e Start convertion of FindPoint()
unC0Rr
parents: 14078
diff changeset
    53
    pub fn integral_norm(self) -> u32 {
5d42204ac35e Start convertion of FindPoint()
unC0Rr
parents: 14078
diff changeset
    54
        distance(self.x, self.y).abs_round()
5d42204ac35e Start convertion of FindPoint()
unC0Rr
parents: 14078
diff changeset
    55
    }
5d42204ac35e Start convertion of FindPoint()
unC0Rr
parents: 14078
diff changeset
    56
5d42204ac35e Start convertion of FindPoint()
unC0Rr
parents: 14078
diff changeset
    57
    #[inline]
14031
c47283feafac add circle filling to land2d
alfadur
parents: 13950
diff changeset
    58
    pub fn transform(self, matrix: &[i32; 4]) -> Self {
14076
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
    59
        Point::new(
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
    60
            matrix[0] * self.x + matrix[1] * self.y,
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
    61
            matrix[2] * self.x + matrix[3] * self.y,
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
    62
        )
14031
c47283feafac add circle filling to land2d
alfadur
parents: 13950
diff changeset
    63
    }
14106
5c1ce63114a5 a bit of simplification
alfadur
parents: 14096
diff changeset
    64
5c1ce63114a5 a bit of simplification
alfadur
parents: 14096
diff changeset
    65
    #[inline]
5c1ce63114a5 a bit of simplification
alfadur
parents: 14096
diff changeset
    66
    pub fn rotate90(self) -> Self {
14107
6a3bcb7c2981 swap coordinate system
alfadur
parents: 14106
diff changeset
    67
        Point::new(self.y, -self.x)
14106
5c1ce63114a5 a bit of simplification
alfadur
parents: 14096
diff changeset
    68
    }
14108
36b792842d5b a bit more simplification
alfadur
parents: 14107
diff changeset
    69
36b792842d5b a bit more simplification
alfadur
parents: 14107
diff changeset
    70
    #[inline]
36b792842d5b a bit more simplification
alfadur
parents: 14107
diff changeset
    71
    pub fn cross(self, other: Point) -> i32 {
36b792842d5b a bit more simplification
alfadur
parents: 14107
diff changeset
    72
        self.dot(other.rotate90())
36b792842d5b a bit more simplification
alfadur
parents: 14107
diff changeset
    73
    }
14125
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14124
diff changeset
    74
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14124
diff changeset
    75
    #[inline]
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
    76
    pub fn clamp(self, rect: &Rect) -> Point {
14131
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    77
        Point::new(
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    78
            rect.x_range().clamp(self.x),
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    79
            rect.y_range().clamp(self.y)
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    80
        )
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    81
    }
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    82
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    83
    #[inline]
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    84
    pub fn line_to(self, end: Point) -> Line {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    85
        Line::new(self, end)
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    86
    }
14125
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14124
diff changeset
    87
14131
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    88
    #[inline]
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    89
    pub fn ray_to(self, end: Point) -> Ray {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    90
        self.line_to(end).to_ray()
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    91
    }
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    92
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    93
    #[inline]
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    94
    pub fn tangent(self) -> i32 {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    95
        self.y / self.x
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    96
    }
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    97
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    98
    #[inline]
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
    99
    pub fn cotangent(self) -> i32 {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   100
        self.x / self.y
14125
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14124
diff changeset
   101
    }
14139
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   102
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   103
    #[inline]
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   104
    pub fn to_fppoint(&self) -> FPPoint {
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   105
        FPPoint::new(self.x.into(), self.y.into())
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   106
    }
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   107
}
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   108
14032
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   109
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   110
pub struct Size {
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   111
    pub width: usize,
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   112
    pub height: usize,
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   113
}
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   114
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   115
impl Size {
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   116
    #[inline]
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   117
    pub fn new(width: usize, height: usize) -> Self {
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   118
        Size { width, height }
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   119
    }
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   120
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   121
    #[inline]
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   122
    pub fn square(size: usize) -> Self {
14076
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   123
        Size {
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   124
            width: size,
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   125
            height: size,
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   126
        }
14032
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   127
    }
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   128
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   129
    #[inline]
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   130
    pub fn area(&self) -> usize {
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   131
        self.width * self.height
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   132
    }
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   133
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   134
    #[inline]
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   135
    pub fn linear_index(&self, x: usize, y: usize) -> usize {
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   136
        y * self.width + x
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   137
    }
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   138
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   139
    #[inline]
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   140
    pub fn is_power_of_two(&self) -> bool {
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   141
        self.width.is_power_of_two() && self.height.is_power_of_two()
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   142
    }
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   143
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   144
    #[inline]
14052
alfadur
parents: 14051 14032
diff changeset
   145
    pub fn next_power_of_two(&self) -> Self {
alfadur
parents: 14051 14032
diff changeset
   146
        Self {
alfadur
parents: 14051 14032
diff changeset
   147
            width: self.width.next_power_of_two(),
14076
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   148
            height: self.height.next_power_of_two(),
14052
alfadur
parents: 14051 14032
diff changeset
   149
        }
alfadur
parents: 14051 14032
diff changeset
   150
    }
alfadur
parents: 14051 14032
diff changeset
   151
alfadur
parents: 14051 14032
diff changeset
   152
    #[inline]
14032
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   153
    pub fn to_mask(&self) -> SizeMask {
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   154
        SizeMask::new(*self)
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   155
    }
14059
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents: 14054
diff changeset
   156
14125
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14124
diff changeset
   157
    #[inline]
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14124
diff changeset
   158
    pub fn to_square(&self) -> Size {
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14124
diff changeset
   159
        Size::square(max(self.width, self.height))
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14124
diff changeset
   160
    }
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14124
diff changeset
   161
14059
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents: 14054
diff changeset
   162
    pub fn to_grid_index(&self) -> GridIndex {
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents: 14054
diff changeset
   163
        GridIndex::new(*self)
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents: 14054
diff changeset
   164
    }
14032
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   165
}
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   166
14076
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   167
pub struct SizeMask {
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   168
    size: Size,
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   169
}
14032
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   170
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   171
impl SizeMask {
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   172
    #[inline]
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   173
    pub fn new(size: Size) -> Self {
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   174
        assert!(size.is_power_of_two());
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   175
        let size = Size {
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   176
            width: !(size.width - 1),
14076
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   177
            height: !(size.height - 1),
14032
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   178
        };
14059
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents: 14054
diff changeset
   179
        Self { size }
14032
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   180
    }
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   181
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   182
    #[inline]
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   183
    pub fn contains_x<T: Into<usize>>(&self, x: T) -> bool {
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   184
        (self.size.width & x.into()) == 0
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   185
    }
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   186
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   187
    #[inline]
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   188
    pub fn contains_y<T: Into<usize>>(&self, y: T) -> bool {
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   189
        (self.size.height & y.into()) == 0
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   190
    }
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   191
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   192
    #[inline]
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   193
    pub fn contains(&self, point: Point) -> bool {
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   194
        self.contains_x(point.x as usize) && self.contains_y(point.y as usize)
2869c2ccb1b8 extract size struct for common usage
alfadur
parents: 14031
diff changeset
   195
    }
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   196
}
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   197
14076
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   198
pub struct GridIndex {
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   199
    shift: Point,
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   200
}
14059
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents: 14054
diff changeset
   201
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents: 14054
diff changeset
   202
impl GridIndex {
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents: 14054
diff changeset
   203
    pub fn new(size: Size) -> Self {
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents: 14054
diff changeset
   204
        assert!(size.is_power_of_two());
14076
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   205
        let shift = Point::new(
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   206
            size.width.trailing_zeros() as i32,
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   207
            size.height.trailing_zeros() as i32,
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   208
        );
14059
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents: 14054
diff changeset
   209
        Self { shift }
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents: 14054
diff changeset
   210
    }
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents: 14054
diff changeset
   211
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents: 14054
diff changeset
   212
    pub fn map(&self, position: Point) -> Point {
14076
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   213
        Point::new(position.x >> self.shift.x, position.y >> self.shift.y)
14059
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents: 14054
diff changeset
   214
    }
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents: 14054
diff changeset
   215
}
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents: 14054
diff changeset
   216
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   217
macro_rules! bin_op_impl {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   218
    ($op: ty, $name: tt) => {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   219
        impl $op for Point {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   220
            type Output = Self;
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   221
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   222
            #[inline]
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   223
            fn $name(self, rhs: Self) -> Self::Output {
13941
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   224
                Self::new(self.x.$name(rhs.x), self.y.$name(rhs.y))
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   225
            }
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   226
        }
13941
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   227
    };
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   228
}
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   229
14088
f483f844da98 component-wise division is actually useful sometimes
alfadur
parents: 14081
diff changeset
   230
macro_rules! scalar_bin_op_impl {
f483f844da98 component-wise division is actually useful sometimes
alfadur
parents: 14081
diff changeset
   231
    ($($op: tt)::+, $name: tt) => {
f483f844da98 component-wise division is actually useful sometimes
alfadur
parents: 14081
diff changeset
   232
        impl $($op)::+<i32> for Point {
f483f844da98 component-wise division is actually useful sometimes
alfadur
parents: 14081
diff changeset
   233
            type Output = Self;
f483f844da98 component-wise division is actually useful sometimes
alfadur
parents: 14081
diff changeset
   234
f483f844da98 component-wise division is actually useful sometimes
alfadur
parents: 14081
diff changeset
   235
            #[inline]
f483f844da98 component-wise division is actually useful sometimes
alfadur
parents: 14081
diff changeset
   236
            fn $name(self, rhs: i32) -> Self::Output {
f483f844da98 component-wise division is actually useful sometimes
alfadur
parents: 14081
diff changeset
   237
                Self::new(self.x.$name(rhs), self.y.$name(rhs))
f483f844da98 component-wise division is actually useful sometimes
alfadur
parents: 14081
diff changeset
   238
            }
f483f844da98 component-wise division is actually useful sometimes
alfadur
parents: 14081
diff changeset
   239
        }
f483f844da98 component-wise division is actually useful sometimes
alfadur
parents: 14081
diff changeset
   240
    };
f483f844da98 component-wise division is actually useful sometimes
alfadur
parents: 14081
diff changeset
   241
}
f483f844da98 component-wise division is actually useful sometimes
alfadur
parents: 14081
diff changeset
   242
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   243
macro_rules! bin_assign_op_impl {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   244
    ($op: ty, $name: tt) => {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   245
        impl $op for Point {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   246
            #[inline]
13941
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   247
            fn $name(&mut self, rhs: Self) {
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   248
                self.x.$name(rhs.x);
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   249
                self.y.$name(rhs.y);
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   250
            }
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   251
        }
13941
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   252
    };
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   253
}
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   254
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   255
bin_op_impl!(Add, add);
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   256
bin_op_impl!(Sub, sub);
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   257
bin_op_impl!(Mul, mul);
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   258
bin_op_impl!(Div, div);
14088
f483f844da98 component-wise division is actually useful sometimes
alfadur
parents: 14081
diff changeset
   259
scalar_bin_op_impl!(Mul, mul);
f483f844da98 component-wise division is actually useful sometimes
alfadur
parents: 14081
diff changeset
   260
scalar_bin_op_impl!(Div, div);
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   261
bin_assign_op_impl!(AddAssign, add_assign);
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   262
bin_assign_op_impl!(SubAssign, sub_assign);
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   263
bin_assign_op_impl!(MulAssign, mul_assign);
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   264
bin_assign_op_impl!(DivAssign, div_assign);
13935
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   265
14051
8a0d69c16cad Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents: 13950
diff changeset
   266
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
8a0d69c16cad Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents: 13950
diff changeset
   267
pub struct Rect {
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   268
    top_left: Point,
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   269
    bottom_right: Point,
14051
8a0d69c16cad Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents: 13950
diff changeset
   270
}
8a0d69c16cad Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents: 13950
diff changeset
   271
8a0d69c16cad Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents: 13950
diff changeset
   272
impl Rect {
8a0d69c16cad Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents: 13950
diff changeset
   273
    #[inline]
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   274
    pub fn new(top_left: Point, bottom_right: Point) -> Self {
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   275
        assert!(top_left.x <= bottom_right.x + 1);
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   276
        assert!(top_left.y <= bottom_right.y + 1);
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   277
        Self { top_left, bottom_right }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   278
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   279
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   280
    pub fn from_box(left: i32, right: i32, top: i32, bottom: i32) -> Self {
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   281
        Self::new(Point::new(left, top), Point::new(right, bottom))
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   282
    }
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   283
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   284
    pub fn from_size(top_left: Point, size: Size) -> Self {
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   285
        Self::new(
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   286
            top_left,
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   287
            top_left + Point::new(size.width as i32 - 1, size.height as i32 - 1)
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   288
        )
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   289
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   290
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   291
    pub fn from_size_coords(x: i32, y: i32, width: usize, height: usize) -> Self {
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   292
        Self::from_size(Point::new(x, y), Size::new(width, height))
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   293
    }
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   294
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   295
    pub fn at_origin(size: Size) -> Self {
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   296
        Self::from_size(Point::zero(), size)
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   297
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   298
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   299
    #[inline]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   300
    pub fn width(&self) -> usize {
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   301
        (self.right() - self.left() + 1) as usize
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   302
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   303
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   304
    #[inline]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   305
    pub fn height(&self) -> usize {
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   306
        (self.right() - self.left() + 1) as usize
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   307
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   308
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   309
    #[inline]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   310
    pub fn size(&self) -> Size {
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   311
        Size::new(self.width(), self.height())
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   312
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   313
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   314
    #[inline]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   315
    pub fn area(&self) -> usize {
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   316
        self.size().area()
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   317
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   318
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   319
    #[inline]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   320
    pub fn left(&self) -> i32 {
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   321
        self.top_left().x
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   322
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   323
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   324
    #[inline]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   325
    pub fn top(&self) -> i32 {
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   326
        self.top_left().y
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   327
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   328
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   329
    #[inline]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   330
    pub fn right(&self) -> i32 {
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   331
        self.bottom_right().x
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   332
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   333
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   334
    #[inline]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   335
    pub fn bottom(&self) -> i32 {
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   336
        self.bottom_right().y
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   337
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   338
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   339
    #[inline]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   340
    pub fn top_left(&self) -> Point {
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   341
        self.top_left
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   342
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   343
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   344
    #[inline]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   345
    pub fn bottom_right(&self) -> Point {
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   346
        self.bottom_right
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   347
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   348
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   349
    #[inline]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   350
    pub fn center(&self) -> Point {
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   351
        (self.top_left() + self.bottom_right()) / 2
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   352
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   353
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   354
    #[inline]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   355
    pub fn with_margin(&self, margin: i32) -> Self {
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   356
        let offset = Point::diag(margin);
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   357
        Self::new(
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   358
            self.top_left() + offset,
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   359
            self.bottom_right() - offset
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   360
        )
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   361
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   362
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   363
    #[inline]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   364
    pub fn x_range(&self) -> RangeInclusive<i32> {
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   365
        self.left()..=self.right()
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   366
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   367
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   368
    #[inline]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   369
    pub fn y_range(&self) -> RangeInclusive<i32> {
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   370
        self.top()..=self.bottom()
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   371
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   372
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   373
    #[inline]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   374
    pub fn contains(&self, point: Point) -> bool {
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   375
        self.x_range().contains(point.x) && self.y_range().contains(point.y)
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   376
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   377
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   378
    #[inline]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   379
    pub fn contains_inside(&self, point: Point) -> bool {
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   380
        point.x > self.left()
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   381
            && point.x < self.right()
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   382
            && point.y > self.top()
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   383
            && point.y < self.bottom()
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   384
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   385
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   386
    #[inline]
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   387
    pub fn intersects(&self, other: &Rect) -> bool {
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   388
        self.left() <= self.right()
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   389
            && self.right() >= other.left()
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   390
            && self.top() <= other.bottom()
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   391
            && self.bottom() >= other.top()
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   392
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   393
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   394
    #[inline]
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   395
    pub fn split_at(&self, point: Point) -> [Rect; 4] {
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   396
        assert!(self.contains_inside(point));
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   397
        [
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   398
            Self::from_box(self.left(), point.x, self.top(), point.y),
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   399
            Self::from_box(point.x, self.right(), self.top(), point.y),
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   400
            Self::from_box(point.x, self.right(), point.y, self.bottom()),
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   401
            Self::from_box(self.left(), point.x, point.y, self.bottom()),
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   402
        ]
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   403
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   404
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   405
    #[inline]
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   406
    pub fn quotient(self, x: usize, y: usize) -> Point {
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   407
        self.top_left() +
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   408
            Point::new(
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   409
                (x % self.width()) as i32,
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   410
                (y % self.height()) as i32
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   411
            )
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   412
    }
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   413
}
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   414
14131
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   415
trait RangeContains<T> {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   416
    fn contains(&self, value: T) -> bool;
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   417
}
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   418
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   419
impl <T: Ord> RangeContains<T> for Range<T> {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   420
    fn contains(&self, value: T) -> bool {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   421
        value >= self.start && value < self.end
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   422
    }
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   423
}
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   424
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   425
impl <T: Ord> RangeContains<T> for RangeInclusive<T> {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   426
    fn contains(&self, value: T) -> bool {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   427
        value >= *self.start() && value <= *self.end()
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   428
    }
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   429
}
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   430
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   431
trait RangeClamp<T> {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   432
    fn clamp(&self, value: T) -> T;
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   433
}
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   434
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   435
impl <T: Ord + Copy> RangeClamp<T> for RangeInclusive<T> {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   436
    fn clamp(&self, value: T) -> T {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   437
        if value < *self.start() {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   438
            *self.start()
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   439
        } else if value > *self.end() {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   440
            *self.end()
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   441
        } else {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   442
            value
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   443
        }
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   444
    }
14051
8a0d69c16cad Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents: 13950
diff changeset
   445
}
8a0d69c16cad Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents: 13950
diff changeset
   446
14094
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   447
pub struct Polygon {
14125
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14124
diff changeset
   448
    vertices: Vec<Point>,
14094
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   449
}
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   450
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   451
impl Polygon {
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   452
    pub fn new(vertices: &[Point]) -> Self {
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   453
        let mut v = Vec::with_capacity(vertices.len() + 1);
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   454
        v.extend_from_slice(vertices);
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   455
        if !v.is_empty() {
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   456
            let start = v[0];
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   457
            v.push(start);
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   458
        }
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   459
        Self { vertices: v }
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   460
    }
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   461
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   462
    pub fn edges_count(&self) -> usize {
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   463
        self.vertices.len() - 1
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   464
    }
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   465
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   466
    pub fn get_edge(&self, index: usize) -> Line {
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   467
        Line::new(self.vertices[index], self.vertices[index + 1])
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   468
    }
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   469
14124
6e0be42d0a8f polygonize OutlinePoints
alfadur
parents: 14112
diff changeset
   470
    pub fn split_edge(&mut self, edge_index: usize, vertex: Point) {
6e0be42d0a8f polygonize OutlinePoints
alfadur
parents: 14112
diff changeset
   471
        self.vertices.insert(edge_index + 1, vertex);
6e0be42d0a8f polygonize OutlinePoints
alfadur
parents: 14112
diff changeset
   472
    }
6e0be42d0a8f polygonize OutlinePoints
alfadur
parents: 14112
diff changeset
   473
6e0be42d0a8f polygonize OutlinePoints
alfadur
parents: 14112
diff changeset
   474
    pub fn iter<'a>(&'a self) -> impl Iterator<Item = &Point> + 'a {
6e0be42d0a8f polygonize OutlinePoints
alfadur
parents: 14112
diff changeset
   475
        (&self.vertices[..self.edges_count()]).iter()
6e0be42d0a8f polygonize OutlinePoints
alfadur
parents: 14112
diff changeset
   476
    }
6e0be42d0a8f polygonize OutlinePoints
alfadur
parents: 14112
diff changeset
   477
14134
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   478
    pub fn iter_mut<'a>(&'a mut self) -> impl Iterator<Item = &mut Point> + 'a {
14124
6e0be42d0a8f polygonize OutlinePoints
alfadur
parents: 14112
diff changeset
   479
        let edges_count = self.edges_count();
14134
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   480
        let start = self.vertices.as_mut_ptr();
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   481
        let end = unsafe { start.add(self.vertices.len()) };
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   482
        PolygonPointsIteratorMut { source: self, start, end }
14094
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   483
    }
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   484
14134
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   485
    fn force_close(&mut self) {
14133
a65b60f36b96 fix polygons getting unclosed on mirroring
alfadur
parents: 14131
diff changeset
   486
        if !self.vertices.is_empty() {
14134
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   487
            self.vertices[0] = self.vertices[self.vertices.len() - 1];
14133
a65b60f36b96 fix polygons getting unclosed on mirroring
alfadur
parents: 14131
diff changeset
   488
        }
a65b60f36b96 fix polygons getting unclosed on mirroring
alfadur
parents: 14131
diff changeset
   489
    }
a65b60f36b96 fix polygons getting unclosed on mirroring
alfadur
parents: 14131
diff changeset
   490
14094
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   491
    pub fn iter_edges<'a>(&'a self) -> impl Iterator<Item = Line> + 'a {
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   492
        (&self.vertices[0..self.edges_count()])
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   493
            .iter()
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   494
            .zip(&self.vertices[1..])
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   495
            .map(|(s, e)| Line::new(*s, *e))
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   496
    }
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   497
}
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   498
14134
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   499
struct PolygonPointsIteratorMut<'a> {
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   500
    source: &'a mut Polygon,
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   501
    start: *mut Point,
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   502
    end: *mut Point
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   503
}
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   504
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   505
impl <'a> Iterator for PolygonPointsIteratorMut<'a> {
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   506
    type Item = &'a mut Point;
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   507
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   508
    fn next(&mut self) -> Option<<Self as Iterator>::Item> {
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   509
        if self.start == self.end {
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   510
            None
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   511
        } else {
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   512
            unsafe {
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   513
                let result = &mut *self.start;
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   514
                self.start = self.start.add(1);
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   515
                Some(result)
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   516
            }
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   517
        }
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   518
    }
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   519
}
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   520
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   521
impl <'a> Drop for PolygonPointsIteratorMut<'a> {
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   522
    fn drop(&mut self) {
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   523
        self.source.force_close();
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   524
    }
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   525
}
09f62bb046ef actually there is a way to preserve mutable polygon iterator
alfadur
parents: 14133
diff changeset
   526
14094
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   527
impl From<Vec<Point>> for Polygon {
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   528
    fn from(mut v: Vec<Point>) -> Self {
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   529
        if !v.is_empty() && v[0] != v[v.len() - 1] {
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   530
            let start = v[0];
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   531
            v.push(start)
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   532
        }
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   533
        Self { vertices: v }
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   534
    }
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   535
}
d0b0d61b7d5e add polygons
alfadur
parents: 14092
diff changeset
   536
14076
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   537
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
14131
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   538
pub struct Ray {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   539
    pub start: Point,
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   540
    pub direction: Point
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   541
}
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   542
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   543
impl Ray {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   544
    #[inline]
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   545
    pub fn new(start: Point, direction: Point) -> Ray {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   546
        Self { start, direction }
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   547
    }
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   548
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   549
    #[inline]
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   550
    pub fn tangent(&self) -> i32 {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   551
        self.direction.tangent()
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   552
    }
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   553
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   554
    #[inline]
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   555
    pub fn cotangent(&self) -> i32 {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   556
        self.direction.cotangent()
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   557
    }
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   558
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   559
    #[inline]
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   560
    pub fn orientation(&self, point: Point) -> i32 {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   561
        (point - self.start).cross(self.direction).signum()
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   562
    }
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   563
}
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   564
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   565
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
14076
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   566
pub struct Line {
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   567
    pub start: Point,
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   568
    pub end: Point,
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   569
}
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   570
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   571
impl Line {
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   572
    #[inline]
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   573
    pub fn new(start: Point, end: Point) -> Self {
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   574
        Self { start, end }
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   575
    }
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   576
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   577
    #[inline]
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   578
    pub fn zero() -> Self {
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   579
        Self::new(Point::zero(), Point::zero())
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   580
    }
14077
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   581
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   582
    #[inline]
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   583
    pub fn center(&self) -> Point {
14088
f483f844da98 component-wise division is actually useful sometimes
alfadur
parents: 14081
diff changeset
   584
        (self.start + self.end) / 2
14077
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   585
    }
14106
5c1ce63114a5 a bit of simplification
alfadur
parents: 14096
diff changeset
   586
5c1ce63114a5 a bit of simplification
alfadur
parents: 14096
diff changeset
   587
    #[inline]
14131
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   588
    pub fn scaled_direction(&self) -> Point {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   589
        self.end - self.start
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   590
    }
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   591
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   592
    #[inline]
14106
5c1ce63114a5 a bit of simplification
alfadur
parents: 14096
diff changeset
   593
    pub fn scaled_normal(&self) -> Point {
14131
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   594
        self.scaled_direction().rotate90()
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   595
    }
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   596
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   597
    #[inline]
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   598
    pub fn to_ray(&self) -> Ray {
c416d32764b7 organize landgen a bit more
alfadur
parents: 14126
diff changeset
   599
        Ray::new(self.start, self.scaled_direction())
14106
5c1ce63114a5 a bit of simplification
alfadur
parents: 14096
diff changeset
   600
    }
14076
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   601
}
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   602
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   603
impl IntoIterator for Line {
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   604
    type Item = Point;
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   605
    type IntoIter = LinePoints;
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   606
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   607
    fn into_iter(self) -> Self::IntoIter {
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   608
        LinePoints::new(self)
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   609
    }
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   610
}
14051
8a0d69c16cad Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents: 13950
diff changeset
   611
13935
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   612
pub struct LinePoints {
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   613
    accumulator: Point,
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   614
    direction: Point,
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   615
    sign: Point,
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   616
    current: Point,
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   617
    total_steps: i32,
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   618
    step: i32,
13935
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   619
}
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   620
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   621
impl LinePoints {
14076
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   622
    pub fn new(line: Line) -> Self {
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   623
        let dir = line.end - line.start;
13935
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   624
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   625
        Self {
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   626
            accumulator: Point::zero(),
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   627
            direction: dir.abs(),
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   628
            sign: dir.signum(),
14076
e5904ead4864 Introduce OutlineSegmentsIterator, some refactoring
unC0Rr
parents: 14059
diff changeset
   629
            current: line.start,
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   630
            total_steps: dir.max_norm(),
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   631
            step: 0,
13935
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   632
        }
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   633
    }
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   634
}
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   635
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   636
impl Iterator for LinePoints {
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   637
    type Item = Point;
13935
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   638
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   639
    fn next(&mut self) -> Option<Self::Item> {
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   640
        if self.step <= self.total_steps {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   641
            self.accumulator += self.direction;
13935
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   642
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   643
            if self.accumulator.x > self.total_steps {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   644
                self.accumulator.x -= self.total_steps;
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   645
                self.current.x += self.sign.x;
13935
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   646
            }
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   647
            if self.accumulator.y > self.total_steps {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   648
                self.accumulator.y -= self.total_steps;
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   649
                self.current.y += self.sign.y;
13935
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   650
            }
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   651
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   652
            self.step += 1;
13935
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   653
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   654
            Some(self.current)
13935
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   655
        } else {
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   656
            None
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   657
        }
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   658
    }
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   659
}
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   660
13941
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   661
pub struct ArcPoints {
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   662
    point: Point,
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   663
    step: i32,
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   664
}
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   665
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   666
impl ArcPoints {
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   667
    pub fn new(radius: i32) -> Self {
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   668
        Self {
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   669
            point: Point::new(0, radius),
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   670
            step: 3 - 2 * radius,
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   671
        }
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   672
    }
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   673
}
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   674
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   675
impl Iterator for ArcPoints {
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   676
    type Item = Point;
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   677
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   678
    fn next(&mut self) -> Option<Self::Item> {
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   679
        if self.point.x < self.point.y {
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   680
            let result = self.point;
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   681
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   682
            if self.step < 0 {
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   683
                self.step += self.point.x * 4 + 6;
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   684
            } else {
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   685
                self.step += (self.point.x - self.point.y) * 4 + 10;
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   686
                self.point.y -= 1;
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   687
            }
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   688
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   689
            self.point.x += 1;
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   690
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   691
            Some(result)
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   692
        } else if self.point.x == self.point.y {
13947
85645992bc8a Fix ArcPoints never finishing
unc0rr
parents: 13943
diff changeset
   693
            self.point.x += 1;
13950
48796bef9e69 Add --protocol option to engine
unc0rr
parents: 13947
diff changeset
   694
13941
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   695
            Some(self.point)
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   696
        } else {
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   697
            None
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   698
        }
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   699
    }
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   700
}
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   701
13942
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   702
pub struct EquidistantPoints {
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   703
    vector: Point,
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   704
    iteration: u8,
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   705
}
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   706
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   707
impl EquidistantPoints {
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   708
    pub fn new(vector: Point) -> Self {
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   709
        Self {
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   710
            vector,
13943
a325ed57ebfe Don't generate unnecessary duplication in case of equal coordinates
unc0rr
parents: 13942
diff changeset
   711
            iteration: if vector.x == vector.y { 4 } else { 8 },
13942
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   712
        }
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   713
    }
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   714
}
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   715
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   716
impl Iterator for EquidistantPoints {
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   717
    type Item = Point;
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   718
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   719
    fn next(&mut self) -> Option<Self::Item> {
13943
a325ed57ebfe Don't generate unnecessary duplication in case of equal coordinates
unc0rr
parents: 13942
diff changeset
   720
        if self.iteration > 0 {
13942
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   721
            self.vector.x = -self.vector.x;
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   722
            if self.iteration & 1 == 0 {
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   723
                self.vector.y = -self.vector.y;
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   724
            }
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   725
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   726
            if self.iteration == 4 {
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   727
                std::mem::swap(&mut self.vector.x, &mut self.vector.y);
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   728
            }
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   729
13943
a325ed57ebfe Don't generate unnecessary duplication in case of equal coordinates
unc0rr
parents: 13942
diff changeset
   730
            self.iteration -= 1;
13942
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   731
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   732
            Some(self.vector)
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   733
        } else {
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   734
            None
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   735
        }
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   736
    }
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   737
}
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   738
14139
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   739
pub struct BezierCurveSegments {
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   740
    segment: Line,
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   741
    c1: FPPoint,
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   742
    c2: FPPoint,
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   743
    offset: FPNum,
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   744
    delta: FPNum,
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   745
}
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   746
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   747
impl BezierCurveSegments {
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   748
    pub fn new(segment: Line, p1: Point, p2: Point, delta: FPNum) -> Self {
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   749
        Self {
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   750
            segment,
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   751
            c1: (segment.start - p1).to_fppoint(),
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   752
            c2: (segment.end - p2).to_fppoint(),
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   753
            offset: fp!(0),
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   754
            delta,
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   755
        }
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   756
    }
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   757
}
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   758
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   759
impl Iterator for BezierCurveSegments {
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   760
    type Item = Point;
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   761
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   762
    fn next(&mut self) -> Option<Self::Item> {
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   763
        if self.offset < fp!(1) {
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   764
            let offset_sq = self.offset * self.offset;
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   765
            let offset_cub = offset_sq * self.offset;
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   766
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   767
            let r1 = fp!(1) - self.offset * 3 + offset_sq * 3 - offset_cub;
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   768
            let r2 = self.offset * 3 - offset_sq * 6 + offset_cub * 3;
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   769
            let r3 = offset_sq * 3 - offset_cub * 3;
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   770
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   771
            let x = r1 * self.segment.start.x
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   772
                + r2 * self.c1.x()
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   773
                + r3 * self.c2.x()
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   774
                + offset_cub * self.segment.end.x;
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   775
            let y = r1 * self.segment.start.y
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   776
                + r2 * self.c1.y()
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   777
                + r3 * self.c2.y()
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   778
                + offset_cub * self.segment.end.y;
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   779
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   780
            self.offset += self.delta;
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   781
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   782
            Some(Point::new(x.round(), y.round()))
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   783
        } else {
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   784
            None
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   785
        }
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   786
    }
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   787
}
37c99587825d Implement BeizerCurveSegments, no tests
unc0rr
parents: 14137
diff changeset
   788
13935
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   789
#[cfg(test)]
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   790
mod tests {
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   791
    use super::*;
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   792
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   793
    fn get_points(coords: &[(i32, i32)]) -> Vec<Point> {
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   794
        coords.iter().map(|(x, y)| Point::new(*x, *y)).collect()
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   795
    }
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   796
13935
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   797
    #[test]
13942
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   798
    fn line_basic() {
14077
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   799
        let line: Vec<Point> = Line::new(Point::new(0, 0), Point::new(3, 3))
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   800
            .into_iter()
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   801
            .collect();
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   802
        let v = get_points(&[(0, 0), (1, 1), (2, 2), (3, 3)]);
13935
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   803
14077
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   804
        assert_eq!(line, v);
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   805
    }
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   806
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   807
    #[test]
13942
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   808
    fn line_skewed() {
14077
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   809
        let line: Vec<Point> = Line::new(Point::new(0, 0), Point::new(5, -7))
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   810
            .into_iter()
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   811
            .collect();
13941
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   812
        let v = get_points(&[
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   813
            (0, 0),
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   814
            (1, -1),
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   815
            (2, -2),
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   816
            (2, -3),
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   817
            (3, -4),
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   818
            (4, -5),
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   819
            (4, -6),
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   820
            (5, -7),
3f69a70063a5 Implement ArcPoints iterator for circles
unc0rr
parents: 13938
diff changeset
   821
        ]);
13938
1fa905aa4cdb move point struct into integral-geometry and use it to refactor a bit
alfadur
parents: 13937
diff changeset
   822
14077
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   823
        assert_eq!(line, v);
13935
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   824
    }
13942
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   825
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   826
    #[test]
13943
a325ed57ebfe Don't generate unnecessary duplication in case of equal coordinates
unc0rr
parents: 13942
diff changeset
   827
    fn equidistant_full() {
14077
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   828
        let n: Vec<Point> = EquidistantPoints::new(Point::new(1, 3)).collect();
13942
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   829
        let v = get_points(&[
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   830
            (-1, -3),
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   831
            (1, -3),
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   832
            (-1, 3),
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   833
            (1, 3),
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   834
            (-3, -1),
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   835
            (3, -1),
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   836
            (-3, 1),
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   837
            (3, 1),
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   838
        ]);
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   839
14077
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   840
        assert_eq!(n, v);
13942
7e7a03e85ac4 Add EquidistantPoints iterator to help iterating over all points of circles
unc0rr
parents: 13941
diff changeset
   841
    }
13943
a325ed57ebfe Don't generate unnecessary duplication in case of equal coordinates
unc0rr
parents: 13942
diff changeset
   842
a325ed57ebfe Don't generate unnecessary duplication in case of equal coordinates
unc0rr
parents: 13942
diff changeset
   843
    #[test]
a325ed57ebfe Don't generate unnecessary duplication in case of equal coordinates
unc0rr
parents: 13942
diff changeset
   844
    fn equidistant_half() {
14077
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   845
        let n: Vec<Point> = EquidistantPoints::new(Point::new(2, 2)).collect();
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   846
        let v = get_points(&[(-2, -2), (2, -2), (-2, 2), (2, 2)]);
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   847
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   848
        assert_eq!(n, v);
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   849
    }
13943
a325ed57ebfe Don't generate unnecessary duplication in case of equal coordinates
unc0rr
parents: 13942
diff changeset
   850
14077
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   851
    #[test]
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   852
    fn line() {
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   853
        let l = Line::new(Point::new(1, 1), Point::new(5, 6));
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   854
5ade484f3351 Refactor tests, add fn center() for Line
unC0Rr
parents: 14076
diff changeset
   855
        assert_eq!(l.center(), Point::new(3, 3));
13943
a325ed57ebfe Don't generate unnecessary duplication in case of equal coordinates
unc0rr
parents: 13942
diff changeset
   856
    }
14078
bf40b5f938b0 - Add methods to work with Rect as box
unC0Rr
parents: 14077
diff changeset
   857
bf40b5f938b0 - Add methods to work with Rect as box
unC0Rr
parents: 14077
diff changeset
   858
    #[test]
bf40b5f938b0 - Add methods to work with Rect as box
unC0Rr
parents: 14077
diff changeset
   859
    fn rect() {
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   860
        let r = Rect::from_box(10, 100, 0, 70);
14078
bf40b5f938b0 - Add methods to work with Rect as box
unC0Rr
parents: 14077
diff changeset
   861
14081
5d42204ac35e Start convertion of FindPoint()
unC0Rr
parents: 14078
diff changeset
   862
        assert!(r.contains_inside(Point::new(99, 69)));
5d42204ac35e Start convertion of FindPoint()
unC0Rr
parents: 14078
diff changeset
   863
        assert!(!r.contains_inside(Point::new(100, 70)));
5d42204ac35e Start convertion of FindPoint()
unC0Rr
parents: 14078
diff changeset
   864
14078
bf40b5f938b0 - Add methods to work with Rect as box
unC0Rr
parents: 14077
diff changeset
   865
        assert_eq!(r.top_left(), Point::new(10, 0));
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   866
        assert_eq!(r.with_margin(12), Rect::from_box(22, 88, 12, 58));
14078
bf40b5f938b0 - Add methods to work with Rect as box
unC0Rr
parents: 14077
diff changeset
   867
    }
14125
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14124
diff changeset
   868
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14124
diff changeset
   869
    #[test]
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14124
diff changeset
   870
    fn fit() {
14137
3119d665d3c6 collapse rectangle types back together with consistent usage of size
alfadur
parents: 14135
diff changeset
   871
        let r = Rect::from_box(10, 100, 0, 70);
14125
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14124
diff changeset
   872
14135
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   873
        assert_eq!(Point::new(0, -10).clamp(&r), Point::new(10, 0));
7f5a591e1c43 separate rectangle types based on right/bottom edge inclusivity
alfadur
parents: 14134
diff changeset
   874
        assert_eq!(Point::new(1000, 1000).clamp(&r), Point::new(100, 70));
14125
376a0551b00a - Add distance-divider option to land_dump
unc0rr
parents: 14124
diff changeset
   875
    }
13935
75eaf7c71789 Introduce integral-geometry crate, implement LinePoints iterator
unc0rr
parents:
diff changeset
   876
}