Hallo Zusammen
Ich bin grade an dem Problem, das ich eine Sigmoid-Funktion habe, die von Oben bzw. Unten nach Unten bzw. Oben läuft.
Das ganze mach ich mit einer Funktion die 4 Parameter brauch,
*Unten ist die Methode mit der ich Zeichne
Nun würde ich gern die Funtion wie den Tangens laufen lassen, Also von Rechts btw. Links nach Links bzw. Rechts
*Die Bilder sind manuell gedreht
Mein gedanken gang war nun: "Drehen wir einfach X und Y um", gemacht getan sah es nun so auf
Hier kann man erkennen, das die Funktion schon richtig verläuft aber nicht richtig auf die breite angepasst ist so tauschte ich die Breite mit der höhe,
was da raus kam, war nicht so wie ich es wollte, nun hab ich ein wenig rum gespielt mit den werten
Jetzt zu meiner Frage
Hat jm eine idee wie ich die Parameter anpassen müsste so das die Kurve in den Ecken endet des Controls,
bzw. hat jm. eine idee wie ich die funktion mittels Tangens hinbekomme oder wie ich die Punkte der Kurve so drehe das
mein gewünschtes ziel rauskommt ?
*Methode
*Voller code
Spoiler anzeigen
Ich bin grade an dem Problem, das ich eine Sigmoid-Funktion habe, die von Oben bzw. Unten nach Unten bzw. Oben läuft.
Dies Funktion habe ich so angepasst, das ich die Y-Achse und die X-Achse einstellen kann so das das Funktion an dem Punkt P(5,5) zb. ausläuft. |
Das ganze mach ich mit einer Funktion die 4 Parameter brauch,
*Unten ist die Methode mit der ich Zeichne
Nun würde ich gern die Funtion wie den Tangens laufen lassen, Also von Rechts btw. Links nach Links bzw. Rechts
*Die Bilder sind manuell gedreht
Links nach Rechts | Rechts nach Links |
Mein gedanken gang war nun: "Drehen wir einfach X und Y um", gemacht getan sah es nun so auf
Hier kann man erkennen, das die Funktion schon richtig verläuft aber nicht richtig auf die breite angepasst ist so tauschte ich die Breite mit der höhe,
was da raus kam, war nicht so wie ich es wollte, nun hab ich ein wenig rum gespielt mit den werten
Jetzt zu meiner Frage
Hat jm eine idee wie ich die Parameter anpassen müsste so das die Kurve in den Ecken endet des Controls,
bzw. hat jm. eine idee wie ich die funktion mittels Tangens hinbekomme oder wie ich die Punkte der Kurve so drehe das
mein gewünschtes ziel rauskommt ?
*Methode
*Voller code
C#-Quellcode
- using System;
- using System.ComponentModel;
- using System.Drawing;
- using System.Drawing.Drawing2D;
- using System.Runtime.CompilerServices;
- using System.Windows.Forms;
- namespace Block {
- public class Wire : Control {
- private const float PI = 3.14159f;
- private GraphicsPath WirePath;
- private Color _WireColor = Color.Gray;
- [Category("Wire")]
- public Color WireColor {
- get => _WireColor;
- set {
- if (_WireColor == value)
- return;
- _WireColor = value;
- Invalidate();
- }
- }
- private int _StrokeWidth = 5;
- [Category("Wire")]
- public int StrokeWidth {
- get => _StrokeWidth;
- set {
- if (_StrokeWidth == value)
- return;
- _StrokeWidth = value;
- Invalidate();
- }
- }
- private DrawDirection _DrawDirection = DrawDirection.BottomToTop;
- public DrawDirection Direction {
- get => _DrawDirection;
- set {
- if (_DrawDirection == value)
- return;
- _DrawDirection = value;
- Invalidate();
- }
- }
- public Wire() {
- InitializeStyle();
- InitializeValues();
- InitializeEvents();
- }
- private void InitializeStyle() {
- ControlStyles styles = ControlStyles.OptimizedDoubleBuffer
- | ControlStyles.SupportsTransparentBackColor
- | ControlStyles.UserPaint
- | ControlStyles.ResizeRedraw;
- SetStyle(styles, true);
- }
- private void InitializeValues() {
- BackColor = Color.Transparent;
- }
- private void InitializeEvents() {
- Invalidated += Wire_Invalidated;
- Paint += Wire_Paint;
- void Wire_Paint(object sender, PaintEventArgs e) {
- ///Setting
- ///
- Graphics graphics = e.Graphics;
- graphics = e.Graphics;
- graphics.SmoothingMode = SmoothingMode.AntiAlias;
- graphics.CompositingQuality = CompositingQuality.HighQuality;
- graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
- graphics.InterpolationMode = InterpolationMode.HighQualityBilinear;
- if (WirePath != null)
- graphics.DrawPath(new Pen(_WireColor, _StrokeWidth), WirePath);
- }
- }
- private void Wire_Invalidated(object sender, InvalidateEventArgs e) => UpdatePath();
- private void UpdatePath() {
- int segments = 32;
- float wh = Width * .5f;
- float hh = Height * .5f;
- float steps = wh / segments;
- PointF[] vertex = new PointF[segments + segments];
- float gamma = (float)Math.Atan2(Height, Width);
- //default
- Func<float, float, float, DrawDirection, float> sigmodY = (x, w, h, d) => Sigmoid(x, w, h, d);
- Func<float, float, PointF> vectorP = (x, y) => new PointF(x + wh, y + hh);
- if (gamma > 1) {
- sigmodY = (x, w, h, d) => Sigmoid(x, w, w, d);
- vectorP = (x, y) => new PointF(y + wh, x + hh);
- }
- //end default
- for (int i = -segments; i < segments; i++) {
- float x = i * steps;
- float y = sigmodY(x, Width, Height, Direction);
- vertex[i + segments] = vectorP(x, y);
- //Console.WriteLine($"x: {x} y: {y}");
- }
- GraphicsPath path = new GraphicsPath();
- path.AddLines(vertex);
- WirePath = path;
- }
- /// <summary>
- /// draw sigmoid
- /// </summary>
- /// <param name="x">X-Achsen Position</param>
- /// <param name="width">Defintions-Bereich</param>
- /// <param name="height">Werte-Bereich</param>
- /// <param name="direction">Abfallen oder Steigend</param>
- /// <returns></returns>
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- private float Sigmoid(float x, float width, float height, DrawDirection direction)
- => (float)(height / (1 + Math.Pow(Math.E, (int) direction * ((6 / (width - (height / 10)) * x))))) - (height * .5f);
- public enum DrawDirection : int {
- TopToBottom = -1,
- BottomToTop = 1,
- LeftToRight = -1,
- RightToLeft = 1
- }
- }
- }
Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „Facebamm“ ()