perfect-shape 0.5.3 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d107db62b52ceb89ecb570f5bb1b77a8adde17cd6d2000e55d0ede5c88c37170
4
- data.tar.gz: a785b27dd723cb869b64b37eb3bceef4e159f78e37b0a95816c05c340b7def8a
3
+ metadata.gz: 98226e1aac4fbac06b162630c2dbaa5ca2f749d24590cc0bd0cca9924f760635
4
+ data.tar.gz: 3d7d5be2905838db9ff1b3f2876e8437e0df90d9ac6b2316c1347aa4f58db626
5
5
  SHA512:
6
- metadata.gz: aef22594d36b2dec69b4685b3040530b838f7eb37749e74ec9ad58a9586b55a302298c68a9ef7f11639975d5284899975059aa3e33b76506ef5e749be7ea11a7
7
- data.tar.gz: 9a59946ad112068bd8e74ff49f843c58b2e73b07216d5ac6d06e5a3911ce006587cc895ba961b5e1eacb26bd997c43aebbba1a3640efee753fab093e4131087d
6
+ metadata.gz: 686a5054b13bd3adf1176e779e80d2ef758c4cf9cc25625633151628a724c1b802c03847301a447fb14155b570ee0fe0fdf8fe4d357b92186bdd7df83d6de240
7
+ data.tar.gz: e05c4a2eb8d2efa7feef615dc5dd3d522778d8aa98b60845726de0d3a0e68bf84ffa173984d0a907401838a16432b725ed1e0ac5ac1d4239ed66596181dac324
data/CHANGELOG.md CHANGED
@@ -1,21 +1,36 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.5.4
4
+
5
+ - `PerfectShape::Rectangle#intersect?(rectangle)`
6
+ - `PerfectShape::Square#intersect?(rectangle)`
7
+ - `PerfectShape::Rectangle#empty?`
8
+ - `PerfectShape::Square#empty?`
9
+ - `PerfectShape::Square#size`/`PerfectShape::Square#size=` aliases for `#length`/`#length=`
10
+
3
11
  ## 0.5.3
4
12
 
5
- - `CubicBezierCurve#intersect?(rectangle)`
13
+ - `PerfectShape::CubicBezierCurve#intersect?(rectangle)`
14
+ - `PerfectShape::CubicBezierCurve#rectangle_crossings(rectangle)`
15
+ - `PerfectShape::CubicBezierCurve#rect_crossings(rxmin, rymin, rxmax, rymax, level, crossings = 0)`
16
+ - `PerfectShape::Line#rect_crossings(rxmin, rymin, rxmax, rymax, crossings = 0)`
6
17
 
7
18
  ## 0.5.2
8
19
 
9
- - `QuadraticBezierCurve#intersect?(rectangle)`
20
+ - `PerfectShape::QuadraticBezierCurve#intersect?(rectangle)`
21
+ - `PerfectShape::QuadraticBezierCurve::tag(coord, low, high)`
22
+ - `PerfectShape::QuadraticBezierCurve::eqn(val, c1, cp, c2)`
23
+ - `PerfectShape::QuadraticBezierCurve::solve_quadratic(eqn)`
24
+ - `PerfectShape::QuadraticBezierCurve::eval_quadratic(vals, num, include0, include1, inflect, c1, ctrl, c2)`
10
25
 
11
26
  ## 0.5.1
12
27
 
13
- - `Point#intersect?(rectangle)` (equivalent to `Rectangle#contain?(point)`)
28
+ - `PerfectShape::Point#intersect?(rectangle)` (equivalent to `PerfectShape::Rectangle#contain?(point)`)
14
29
 
15
30
  ## 0.5.0
16
31
 
17
- - `Line#intersect?(rectangle)`
18
- - `Rectangle#out_state(x_or_point, y = nil)`
32
+ - `PerfectShape::Line#intersect?(rectangle)`
33
+ - `PerfectShape::Rectangle#out_state(x_or_point, y = nil)`
19
34
 
20
35
  ## 0.4.0
21
36
 
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Perfect Shape 0.5.3
1
+ # Perfect Shape 0.5.4
2
2
  ## Geometric Algorithms
3
3
  [![Gem Version](https://badge.fury.io/rb/perfect-shape.svg)](http://badge.fury.io/rb/perfect-shape)
4
4
  [![Test](https://github.com/AndyObtiva/perfect-shape/actions/workflows/ruby.yml/badge.svg)](https://github.com/AndyObtiva/perfect-shape/actions/workflows/ruby.yml)
@@ -14,13 +14,13 @@ To ensure high accuracy, this library does all its mathematical operations with
14
14
  Run:
15
15
 
16
16
  ```
17
- gem install perfect-shape -v 0.5.3
17
+ gem install perfect-shape -v 0.5.4
18
18
  ```
19
19
 
20
20
  Or include in Bundler `Gemfile`:
21
21
 
22
22
  ```ruby
23
- gem 'perfect-shape', '~> 0.5.3'
23
+ gem 'perfect-shape', '~> 0.5.4'
24
24
  ```
25
25
 
26
26
  And, run:
@@ -372,8 +372,10 @@ Includes `PerfectShape::RectangularShape`
372
372
  - `#bounding_box`: bounding box is a rectangle with x = min x, y = min y, and width/height of shape
373
373
  - `#==(other)`: Returns `true` if equal to `other` or `false` otherwise
374
374
  - `#contain?(x_or_point, y=nil, outline: false, distance_tolerance: 0)`: checks if point is inside when `outline` is `false` or if point is on the outline when `outline` is `true`. `distance_tolerance` can be used as a fuzz factor when `outline` is `true`, for example, to help GUI users mouse-click-select a rectangle shape from its outline more successfully
375
+ - `#intersect?(rectangle)`: Returns `true` if intersecting with interior of rectangle or `false` otherwise. This is useful for GUI optimization checks of whether a shape appears in a GUI viewport rectangle and needs redrawing
375
376
  - `#edges`: edges of rectangle as `PerfectShape::Line` objects
376
377
  - `#out_state(x_or_point, y = nil)`: Returns "out state" of specified point (x,y) (whether it lies to the left, right, top, bottom of rectangle). If point is outside rectangle, it returns a bit mask combination of `Rectangle::OUT_LEFT`, `Rectangle::OUT_RIGHT`, `Rectangle::OUT_TOP`, or `Rectangle::OUT_BOTTOM`. Otherwise, it returns `0` if point is inside the rectangle.
378
+ - `#empty?`: Returns `true` if width or height are 0 (or negative) and `false` otherwise
377
379
 
378
380
  Example:
379
381
 
@@ -402,7 +404,7 @@ Extends `PerfectShape::Rectangle`
402
404
 
403
405
  ![square](https://raw.githubusercontent.com/AndyObtiva/perfect-shape/master/images/square.png)
404
406
 
405
- - `::new(x: 0, y: 0, length: 1)`: constructs a square
407
+ - `::new(x: 0, y: 0, length: 1)` (`length` alias: `size`): constructs a square
406
408
  - `#x`: top-left x
407
409
  - `#y`: top-left y
408
410
  - `#length`: length
@@ -418,7 +420,9 @@ Extends `PerfectShape::Rectangle`
418
420
  - `#bounding_box`: bounding box is a rectangle with x = min x, y = min y, and width/height of shape
419
421
  - `#==(other)`: Returns `true` if equal to `other` or `false` otherwise
420
422
  - `#contain?(x_or_point, y=nil, outline: false, distance_tolerance: 0)`: checks if point is inside when `outline` is `false` or if point is on the outline when `outline` is `true`. `distance_tolerance` can be used as a fuzz factor when `outline` is `true`, for example, to help GUI users mouse-click-select a square shape from its outline more successfully
423
+ - `#intersect?(rectangle)`: Returns `true` if intersecting with interior of rectangle or `false` otherwise. This is useful for GUI optimization checks of whether a shape appears in a GUI viewport rectangle and needs redrawing
421
424
  - `#edges`: edges of square as `PerfectShape::Line` objects
425
+ - `#empty?`: Returns `true` if length is 0 (or negative) and `false` otherwise
422
426
 
423
427
  Example:
424
428
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.3
1
+ 0.5.4
@@ -97,5 +97,24 @@ module PerfectShape
97
97
  end
98
98
  out
99
99
  end
100
+
101
+ # A rectangle is empty if its width or height is 0 (or less)
102
+ def empty?
103
+ width <= 0.0 || height <= 0.0
104
+ end
105
+
106
+ def intersect?(rectangle)
107
+ x = rectangle.x
108
+ y = rectangle.y
109
+ w = rectangle.width
110
+ h = rectangle.height
111
+ return false if empty? || w <= 0 || h <= 0
112
+ x0 = self.x
113
+ y0 = self.y
114
+ (x + w) > x0 &&
115
+ (y + h) > y0 &&
116
+ x < (x0 + self.width) &&
117
+ y < (y0 + self.height)
118
+ end
100
119
  end
101
120
  end
@@ -23,12 +23,15 @@ require 'perfect_shape/rectangle'
23
23
 
24
24
  module PerfectShape
25
25
  class Square < Rectangle
26
- MESSAGE_WIDTH_AND_HEIGHT_AND_LENGTH_NOT_EQUAL = 'Square width, height, and length must all be equal if more than one is specified; or otherwise keep only one of them in arguments!'
26
+ MESSAGE_WIDTH_AND_HEIGHT_AND_LENGTH_NOT_EQUAL = 'Square width, height, and length must all be equal if more than one is specified; or otherwise keep only one of them in constructor arguments!'
27
27
 
28
28
  attr_reader :length
29
+ alias size length
29
30
 
30
31
  # Constructs with x, y, length (optionally width or height can be passed as alias for length)
31
- def initialize(x: 0, y: 0, length: nil, width: nil, height: nil)
32
+ def initialize(x: 0, y: 0, length: nil, size: nil, width: nil, height: nil)
33
+ raise MESSAGE_WIDTH_AND_HEIGHT_AND_LENGTH_NOT_EQUAL if (length && size && length != size)
34
+ length ||= size
32
35
  raise MESSAGE_WIDTH_AND_HEIGHT_AND_LENGTH_NOT_EQUAL if (length && width && length != width) || (length && height && length != height) || (width && height && width != height)
33
36
  length ||= width || height || 1
34
37
  super(x: x, y: y, width: length, height: length)
@@ -40,6 +43,7 @@ module PerfectShape
40
43
  self.width = value unless width == value
41
44
  self.height = value unless height == value
42
45
  end
46
+ alias size= length=
43
47
 
44
48
  def width=(value)
45
49
  super
@@ -2,11 +2,11 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: perfect-shape 0.5.3 ruby lib
5
+ # stub: perfect-shape 0.5.4 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "perfect-shape".freeze
9
- s.version = "0.5.3"
9
+ s.version = "0.5.4"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: perfect-shape
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Maleh