Dynamic line thickness.
This commit is contained in:
parent
bd70c17bf6
commit
cd05a6829c
@ -6,12 +6,18 @@ public partial class PieChart : UserControl
|
||||
{
|
||||
public List<(Color, double)> Values { get; set; }
|
||||
|
||||
public float DpiFloat { get; private set; }
|
||||
|
||||
public PieChart()
|
||||
{
|
||||
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
|
||||
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
|
||||
SetStyle(ControlStyles.UserPaint, true);
|
||||
|
||||
Graphics tempG = CreateGraphics();
|
||||
DpiFloat = (tempG.DpiX + tempG.DpiY) / 2;
|
||||
tempG.Dispose();
|
||||
|
||||
Values = [];
|
||||
InitializeComponent();
|
||||
}
|
||||
@ -41,7 +47,7 @@ public partial class PieChart : UserControl
|
||||
}
|
||||
|
||||
// Draw the outline.
|
||||
Pen outlinePartsPen = new(Color.FromArgb(unchecked((int)0xFF_202020)), 3);
|
||||
Pen outlinePartsPen = new(Color.FromArgb(unchecked((int)0xFF_202020)), DpiFloat * 3 / 192);
|
||||
current = 0;
|
||||
foreach ((Color, double value) item in Values)
|
||||
{
|
||||
@ -53,7 +59,7 @@ public partial class PieChart : UserControl
|
||||
}
|
||||
|
||||
// Outline
|
||||
Pen outlinePen = new(Color.FromArgb(unchecked((int)0xFF_202020)), 5);
|
||||
Pen outlinePen = new(Color.FromArgb(unchecked((int)0xFF_202020)), DpiFloat * 5 / 192);
|
||||
g.DrawEllipse(outlinePen, rect);
|
||||
}
|
||||
}
|
||||
|
||||
@ -37,7 +37,7 @@ public partial class GraphColorPickerForm : Form
|
||||
MessageLabel.Text = $"Pick a color for {able.Name}.";
|
||||
|
||||
// Add preset buttons.
|
||||
const int size = 48;
|
||||
int size = (int)(graph.DpiFloat * 48 / 192);
|
||||
int position = 0;
|
||||
foreach (uint cId in Graphable.DefaultColors)
|
||||
{
|
||||
|
||||
@ -14,6 +14,8 @@ public partial class GraphForm : Form
|
||||
public Float2 ScreenCenter { get; private set; }
|
||||
public Float2 Dpi { get; private set; }
|
||||
|
||||
public float DpiFloat { get; private set; }
|
||||
|
||||
public double ZoomLevel
|
||||
{
|
||||
get => _zoomLevel;
|
||||
@ -57,6 +59,9 @@ public partial class GraphForm : Form
|
||||
Graphics tempG = CreateGraphics();
|
||||
Dpi = new(tempG.DpiX, tempG.DpiY);
|
||||
tempG.Dispose();
|
||||
|
||||
DpiFloat = (float)((Dpi.x + Dpi.y) / 2);
|
||||
|
||||
ables = [];
|
||||
ZoomLevel = 1;
|
||||
initialWindowPos = Location;
|
||||
@ -102,7 +107,7 @@ public partial class GraphForm : Form
|
||||
|
||||
// Draw horizontal/vertical quarter-axis.
|
||||
Brush quarterBrush = new SolidBrush(QuarterAxisColor);
|
||||
Pen quarterPen = new(quarterBrush, 2);
|
||||
Pen quarterPen = new(quarterBrush, DpiFloat * 2 / 192);
|
||||
|
||||
for (double x = Math.Ceiling(MinVisibleGraph.x * 4 / axisScale) * axisScale / 4; x <= Math.Floor(MaxVisibleGraph.x * 4 / axisScale) * axisScale / 4; x += axisScale / 4)
|
||||
{
|
||||
@ -119,7 +124,7 @@ public partial class GraphForm : Form
|
||||
|
||||
// Draw horizontal/vertical semi-axis.
|
||||
Brush semiBrush = new SolidBrush(SemiAxisColor);
|
||||
Pen semiPen = new(semiBrush, 2);
|
||||
Pen semiPen = new(semiBrush, DpiFloat * 2 / 192);
|
||||
|
||||
for (double x = Math.Ceiling(MinVisibleGraph.x / axisScale) * axisScale; x <= Math.Floor(MaxVisibleGraph.x / axisScale) * axisScale; x += axisScale)
|
||||
{
|
||||
@ -135,7 +140,7 @@ public partial class GraphForm : Form
|
||||
}
|
||||
|
||||
Brush mainLineBrush = new SolidBrush(MainAxisColor);
|
||||
Pen mainLinePen = new(mainLineBrush, 3);
|
||||
Pen mainLinePen = new(mainLineBrush, DpiFloat * 3 / 192);
|
||||
|
||||
// Draw the main axis (on top of the semi axis).
|
||||
Int2 startCenterY = GraphSpaceToScreenSpace(new Float2(0, MinVisibleGraph.y)),
|
||||
@ -162,7 +167,8 @@ public partial class GraphForm : Form
|
||||
{
|
||||
IEnumerable<IGraphPart> lines = ables[i].GetItemsToRender(this);
|
||||
Brush graphBrush = new SolidBrush(ables[i].Color);
|
||||
foreach (IGraphPart gp in lines) gp.Render(this, g, graphBrush);
|
||||
Pen graphPen = new(graphBrush, DpiFloat * 3 / 192);
|
||||
foreach (IGraphPart gp in lines) gp.Render(this, g, graphPen);
|
||||
}
|
||||
|
||||
base.OnPaint(e);
|
||||
|
||||
@ -32,6 +32,10 @@ public partial class ViewCacheForm : Form
|
||||
CachePie.Values.Add((able.Color, thisBytes));
|
||||
totalBytes += thisBytes;
|
||||
|
||||
int buttonHeight = (int)(refForm.DpiFloat * 46 / 192),
|
||||
buttonWidth = (int)(refForm.DpiFloat * 92 / 192),
|
||||
buttonSpaced = (int)(refForm.DpiFloat * 98 / 192);
|
||||
|
||||
if (index < labelCache.Count)
|
||||
{
|
||||
Label reuseLabel = labelCache[index];
|
||||
@ -45,9 +49,9 @@ public partial class ViewCacheForm : Form
|
||||
Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right,
|
||||
AutoEllipsis = true,
|
||||
ForeColor = able.Color,
|
||||
Location = new Point(0, labelCache.Count * 46),
|
||||
Location = new Point(0, labelCache.Count * buttonHeight),
|
||||
Parent = SpecificCachePanel,
|
||||
Size = new Size(SpecificCachePanel.Width - 98, 46),
|
||||
Size = new Size(SpecificCachePanel.Width - buttonSpaced, buttonHeight),
|
||||
Text = $"{able.Name}: {thisBytes.FormatAsBytes()}",
|
||||
TextAlign = ContentAlignment.MiddleLeft,
|
||||
};
|
||||
@ -59,9 +63,9 @@ public partial class ViewCacheForm : Form
|
||||
Button newButton = new()
|
||||
{
|
||||
Anchor = AnchorStyles.Top | AnchorStyles.Right,
|
||||
Location = new Point(SpecificCachePanel.Width - 92, buttonCache.Count * 46),
|
||||
Location = new Point(SpecificCachePanel.Width - buttonWidth, buttonCache.Count * buttonHeight),
|
||||
Parent = SpecificCachePanel,
|
||||
Size = new Size(92, 46),
|
||||
Size = new Size(buttonWidth, buttonHeight),
|
||||
Text = "Clear"
|
||||
};
|
||||
newButton.Click += (o, e) => EraseSpecificGraphable_Click(able);
|
||||
|
||||
@ -4,5 +4,5 @@ namespace Graphing;
|
||||
|
||||
public interface IGraphPart
|
||||
{
|
||||
public void Render(in GraphForm form, in Graphics g, in Brush brush);
|
||||
public void Render(in GraphForm form, in Graphics g, in Pen pen);
|
||||
}
|
||||
|
||||
@ -18,15 +18,13 @@ public record struct GraphLine : IGraphPart
|
||||
this.b = b;
|
||||
}
|
||||
|
||||
public readonly void Render(in GraphForm form, in Graphics g, in Brush brush)
|
||||
public readonly void Render(in GraphForm form, in Graphics g, in Pen pen)
|
||||
{
|
||||
if (!double.IsFinite(a.x) || !double.IsFinite(a.y) ||
|
||||
!double.IsFinite(b.x) || !double.IsFinite(b.y)) return;
|
||||
|
||||
Int2 start = form.GraphSpaceToScreenSpace(a),
|
||||
end = form.GraphSpaceToScreenSpace(b);
|
||||
|
||||
Pen pen = new(brush, 3);
|
||||
g.DrawLine(pen, start, end);
|
||||
}
|
||||
}
|
||||
|
||||
@ -25,7 +25,7 @@ public record struct GraphRectangle : IGraphPart
|
||||
max = max
|
||||
};
|
||||
|
||||
public void Render(in GraphForm form, in Graphics g, in Brush brush)
|
||||
public void Render(in GraphForm form, in Graphics g, in Pen pen)
|
||||
{
|
||||
if (!double.IsFinite(max.x) || !double.IsFinite(max.y) ||
|
||||
!double.IsFinite(min.x) || !double.IsFinite(min.y)) return;
|
||||
@ -40,6 +40,6 @@ public record struct GraphRectangle : IGraphPart
|
||||
start.y - end.y);
|
||||
|
||||
if (size.x == 0 || size.y == 0) return;
|
||||
g.FillRectangle(brush, new Rectangle(start.x, end.y, size.x, size.y));
|
||||
g.FillRectangle(pen.Brush, new Rectangle(start.x, end.y, size.x, size.y));
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,14 +18,14 @@ public record struct GraphUiCircle : IGraphPart
|
||||
this.radius = radius;
|
||||
}
|
||||
|
||||
public readonly void Render(in GraphForm form, in Graphics g, in Brush brush)
|
||||
public readonly void Render(in GraphForm form, in Graphics g, in Pen pen)
|
||||
{
|
||||
if (!double.IsFinite(center.x) || !double.IsFinite(center.y) ||
|
||||
!double.IsFinite(radius) || radius == 0) return;
|
||||
|
||||
Int2 centerPix = form.GraphSpaceToScreenSpace(center);
|
||||
g.FillEllipse(brush, new Rectangle(new Point(centerPix.x - radius,
|
||||
centerPix.y - radius),
|
||||
g.FillEllipse(pen.Brush, new Rectangle(new Point(centerPix.x - radius,
|
||||
centerPix.y - radius),
|
||||
new Size(radius * 2, radius * 2)));
|
||||
}
|
||||
}
|
||||
|
||||
@ -10,28 +10,14 @@ internal static class Program
|
||||
{
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
Application.SetHighDpiMode(HighDpiMode.SystemAware);
|
||||
Application.SetHighDpiMode(HighDpiMode.PerMonitorV2);
|
||||
|
||||
GraphForm graph = new("One Of The Graphing Calculators Of All Time");
|
||||
|
||||
Equation equ1 = new(x =>
|
||||
{
|
||||
// Demonstrate the caching abilities of the software.
|
||||
// This extra waiting is done every time the form requires a
|
||||
// calculation done. At the start, it'll be laggy, but as you
|
||||
// move around and zoom in, more pieces are cached, and when
|
||||
// you reset, the viewport will be a lot less laggy.
|
||||
|
||||
// Remove this loop to make the equation fast again. I didn't
|
||||
// slow the engine down much more with this improvement, so any
|
||||
// speed decrease you might notice is likely this function.
|
||||
for (int i = 0; i < 1_000_000; i++) ;
|
||||
return -x * x + 2;
|
||||
});
|
||||
Equation equ1 = new(x => -x * x + 2);
|
||||
Equation equ2 = new(x => x);
|
||||
Equation equ3 = new(x => -Math.Sqrt(x));
|
||||
SlopeField sf = new(2, (x, y) => (x * x - y * y) / x);
|
||||
graph.Graph(equ1, equ2, equ3, sf);
|
||||
graph.Graph(equ1, equ2, equ3);
|
||||
|
||||
// You can also now view and reset caches in the UI by going to
|
||||
// Misc > View Caches.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user