mirror of
https://github.com/riegera2412/UVtools.git
synced 2026-07-11 11:02:32 +02:00
ca6f623a9f
- **Layer:**
- (Add) Property: `LayerMatBoundingRectangle`
- (Add) Property: `LayerMatModelBoundingRectangle`
- (Add) Method: `GetLayerMat(roi)`
- **Issues:**
- **Islands:**
- (Improvement) Islands detection performance
- (Improvement) Required area to consider an island is now real area instead of bounding box area
- (Fix) Logic bug when combining with overhangs
- **Overhangs:**
- (Improvement) Overhangs detection performance
- (Improvement) Overhangs are now split and identified as separately in the layer
- (Improvement) Overhangs now shows the correct issue area and able to locate the problem region more precisely
- (Improvement) Compress overhangs into contours instead of using whole pixels, resulting in better render performance and less memory to hold the issue
- (Fix) Bug in overhang logic causing to detect the problem twice when combined with supports
- (Improvement) Touching bounds check logic to spare cycles
- **Tool - Raise platform on print finish:**
- (Add) Preset "Minimum": Sets to the minimum position
- (Add) Preset "Medium": Sets to half-way between minimum and maximum position
- (Add) Preset "Maximum": Sets to the maximum position
- (Add) Wait time: Sets the ensured wait time to stay still on the desired position.
This is useful if the printer firmware always move to top and you want to stay still on the set position for at least the desired time.
Note: The print time calculation will take this wait into consideration and display a longer print time.
- (Add) FileFormat: AnyCubic custom machine (.pwc)
- (Downgrade) OpenCV from 4.5.5 to 4.5.4 due a possible crash while detecting islands (Windows)
86 lines
3.2 KiB
C#
86 lines
3.2 KiB
C#
/*
|
|
* GNU AFFERO GENERAL PUBLIC LICENSE
|
|
* Version 3, 19 November 2007
|
|
* Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
|
* Everyone is permitted to copy and distribute verbatim copies
|
|
* of this license document, but changing it is not allowed.
|
|
*/
|
|
using System;
|
|
using System.Drawing;
|
|
|
|
namespace UVtools.Core.Extensions;
|
|
|
|
public static class PointExtensions
|
|
{
|
|
public static double FindLength(Point start, Point end) => Math.Sqrt(Math.Pow(end.Y - start.Y, 2) + Math.Pow(end.X - start.X, 2));
|
|
|
|
public static bool IsAnyNegative(this Point point) => point.X < 0 || point.Y < 0;
|
|
public static bool IsBothNegative(this Point point) => point.X < 0 && point.Y < 0;
|
|
public static bool IsBothZeroOrPositive(this Point point) => point.X >= 0 && point.Y >= 0;
|
|
|
|
public static Point Rotate(this Point point, double angleDegree, Point pivot = default)
|
|
{
|
|
if (angleDegree % 360 == 0) return point;
|
|
double angle = angleDegree * Math.PI / 180;
|
|
double cos = Math.Cos(angle);
|
|
double sin = Math.Sin(angle);
|
|
int dx = point.X - pivot.X;
|
|
int dy = point.Y - pivot.Y;
|
|
double x = cos * dx - sin * dy + pivot.X;
|
|
double y = sin * dx + cos * dy + pivot.Y;
|
|
|
|
return new((int)Math.Round(x), (int)Math.Round(y));
|
|
}
|
|
|
|
public static PointF Rotate(this PointF point, double angleDegree, PointF pivot = default)
|
|
{
|
|
if (angleDegree % 360 == 0) return point;
|
|
double angle = angleDegree * Math.PI / 180;
|
|
double cos = Math.Cos(angle);
|
|
double sin = Math.Sin(angle);
|
|
double dx = point.X - pivot.X;
|
|
double dy = point.Y - pivot.Y;
|
|
double x = cos * dx - sin * dy + pivot.X;
|
|
double y = sin * dx + cos * dy + pivot.Y;
|
|
|
|
return new((float) x, (float) y);
|
|
}
|
|
|
|
public static void Rotate(Point[] points, double angleDegree, Point pivot = default)
|
|
{
|
|
for (int i = 0; i < points.Length; i++)
|
|
{
|
|
points[i] = points[i].Rotate(angleDegree, pivot);
|
|
}
|
|
}
|
|
|
|
public static void Rotate(PointF[] points, double angleDegree, PointF pivot = default)
|
|
{
|
|
for (int i = 0; i < points.Length; i++)
|
|
{
|
|
points[i] = points[i].Rotate(angleDegree, pivot);
|
|
}
|
|
}
|
|
|
|
public static Point Invert(this Point point) => new(-point.X, -point.Y);
|
|
|
|
public static PointF Invert(this PointF point) => new(-point.X, -point.Y);
|
|
|
|
public static Point OffsetBy(this Point point, int value)=> new(point.X + value, point.Y + value);
|
|
public static Point OffsetBy(this Point point, int x, int y) => new(point.X + x, point.Y + y);
|
|
public static Point OffsetBy(this Point point, Point other) => new(point.X + other.X, point.Y + other.Y);
|
|
|
|
|
|
public static Point Half(this Point point) => new(point.X / 2, point.Y / 2);
|
|
public static PointF Half(this PointF point) => new(point.X / 2, point.Y / 2);
|
|
public static Point ToPoint(this PointF point) => new((int) Math.Round(point.X), (int) Math.Round(point.Y));
|
|
|
|
|
|
|
|
public static Size ToSize(this Point point) => new(point.X, point.Y);
|
|
|
|
public static SizeF ToSize(this PointF point) => new(point.X, point.Y);
|
|
|
|
|
|
|
|
} |