Wens
Ik ben bezig met het tekenen van een soort klok. In die klok wil ik een wijzer tekenen in de vorm van een driehoek ik wil ook dat de wijzer een "border" heeft.
Probleem
De vorm van de klok lukt (schaalverdeling, getallen, ...), de achtergrond van de wijzer ook maar ik loop vast op de border van de wijzer.
Ik teken de achtergrond van de wijzer d.m.v. de methode Graphics.FillPolygon. Aan die methode geef ik de coördinaten van de hoeken van de driehoek mee met als resultaat:

Vervolgens wil ik de border van de wijzer tekenen d.m.v. de methode Graphics.DrawPolygon waaraan ik dezelfde coördinaten mee geef.
Dit geeft het gewenste resultaat:

Echter als de dikte van de border groter is dan 1 pixel dan komt de "wijs-punt" van de wijzer te hoog te liggen. Dit komt omdat de border aan de buitenkant van de driehoek getekend wordt. Zie:

Wat ik dus wil is dat de border precies binnen de cirkel valt.
Zelf geprobeerd
- Op GoT gezocht naar anderen met dit probleem.
- Op internet gezocht of het mogelijk is om de border aan de binnenkant van de driehoek te laten tekenen d.m.v. aan andere methode/overload. Niet kunnen vinden.
- Proberen uit te rekenen wat de coördinaten van de border-driehoek moeten zijn zodat de border aan de binnenkant wordt getekend. Niet gelukt i.v.m. gebrek aan kennis.
Demo code
Dit is een relevant stukje demo code waarin duidelijk het probleem naar voren komt (als je het runt
)
Download het Visual Studio Project
En alvast wat antwoorden om het draadje ontopic te houden
:
- Ja, ik wil de border dikker dan 1px.
- Ja, ik wil het persé zelf tekenen en geen bestaande library gebruiken.
Ik ben bezig met het tekenen van een soort klok. In die klok wil ik een wijzer tekenen in de vorm van een driehoek ik wil ook dat de wijzer een "border" heeft.
Probleem
De vorm van de klok lukt (schaalverdeling, getallen, ...), de achtergrond van de wijzer ook maar ik loop vast op de border van de wijzer.
Ik teken de achtergrond van de wijzer d.m.v. de methode Graphics.FillPolygon. Aan die methode geef ik de coördinaten van de hoeken van de driehoek mee met als resultaat:

Vervolgens wil ik de border van de wijzer tekenen d.m.v. de methode Graphics.DrawPolygon waaraan ik dezelfde coördinaten mee geef.
Dit geeft het gewenste resultaat:

Echter als de dikte van de border groter is dan 1 pixel dan komt de "wijs-punt" van de wijzer te hoog te liggen. Dit komt omdat de border aan de buitenkant van de driehoek getekend wordt. Zie:

Wat ik dus wil is dat de border precies binnen de cirkel valt.
Zelf geprobeerd
- Op GoT gezocht naar anderen met dit probleem.
- Op internet gezocht of het mogelijk is om de border aan de binnenkant van de driehoek te laten tekenen d.m.v. aan andere methode/overload. Niet kunnen vinden.
- Proberen uit te rekenen wat de coördinaten van de border-driehoek moeten zijn zodat de border aan de binnenkant wordt getekend. Niet gelukt i.v.m. gebrek aan kennis.
Demo code
Dit is een relevant stukje demo code waarin duidelijk het probleem naar voren komt (als je het runt
C#:
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
| protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics g = e.Graphics; g.SmoothingMode = SmoothingMode.AntiAlias; // Kortste zijde gebruiken int size = ((e.ClipRectangle.Height > ClientRectangle.Width) ? ClientRectangle.Width : ClientRectangle.Height); // 30 pixels vanaf de kant. size -= 30; // Middenpunt berekeken. PointF center = new PointF( ClientRectangle.X + ClientRectangle.Width / 2F, ClientRectangle.Y + ClientRectangle.Height / 2F ); // Rectangle waar binnen de klok getekend moet worden. RectangleF bounds = new RectangleF(center.X - size / 2F, center.Y - size / 2F, size, size); // Achtergrond cirkel tekenen. g.FillPie(new SolidBrush(Color.White), bounds.X, bounds.Y, bounds.Width, bounds.Height, 0, 360); // Radius berekenen. float r = (size) / 2F; // Het is 2 uur. int hours = 2; // Hoek op 0 of 12 uur. float zeroHourAngle = (float)Math.PI; // Hoek bij de aangegeven tijd (2 uur in dit geval). float angle = (float)(zeroHourAngle - ((360F / 12F * hours) / 180F * Math.PI)); // De breedte van de basis van de wijzer. float pointerBaseWidth = 25F; PointF p0 = new PointF( (float)(center.X + (pointerBaseWidth / 2) * Math.Sin(angle - (Math.PI / 2))), (float)(center.Y + (pointerBaseWidth / 2) * Math.Cos(angle - (Math.PI / 2))) ); PointF p1 = new PointF( (float)(center.X + (pointerBaseWidth / 2) * Math.Sin(angle + (Math.PI / 2))), (float)(center.Y + (pointerBaseWidth / 2) * Math.Cos(angle + (Math.PI / 2))) ); PointF p2 = new PointF( (float)(center.X + r * Math.Sin(angle)), (float)(center.Y + r * Math.Cos(angle)) ); /* Wijzer tekenen */ // Arcering g.FillPolygon(new SolidBrush(Color.LightGray), new PointF[] { p0, p1, p2 }); // Border g.DrawPolygon(new Pen(Color.Gray, 5), new PointF[] { p0, p1, p2 }); //g.FillPolygon(Pen, new PointF[] { p0, p1, p2 }); /* Test lijnen */ // Centerpunt float centerPointWidth = 6; g.FillPie(new SolidBrush(Color.Red), center.X - centerPointWidth / 2F, center.Y - centerPointWidth / 2F, centerPointWidth, centerPointWidth, 0, 360); g.SmoothingMode = SmoothingMode.Default; // Bounds g.DrawRectangle(new Pen(Color.Violet, 1), bounds.X, bounds.Y, bounds.Width, bounds.Height); } |
Download het Visual Studio Project
En alvast wat antwoorden om het draadje ontopic te houden
- Ja, ik wil de border dikker dan 1px.
- Ja, ik wil het persé zelf tekenen en geen bestaande library gebruiken.