System.Drawing.Drawing2D; Punkteliste grafisch darstellen

03/11/2007 - 09:54 von Petra Rohmer | Report spam
Hallo,
Hallo Frank,

ich würde gerne die Punkte in mm zeichnen, danach transformieren, das
bewahrt die Übersicht.
Leider fehlt mit das letzte know how.
Kannst Du mit bitte nochmals helfen?
DANKE.
Grüße Petra

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace ucProductlistView
{
public partial class ucProductlistView : UserControl
{
//*****************************************************************************
public enum Origin
{
TopLeft,
TopRight,
BottomLeft,
BottomRight
}

//--
const float fX = 0;
const float fY = 0;
const float fWidth = 900;
const float fHeight = 500;


#region Punkte Liste
public List<Codes> listCodes;

/// <summary>Die Farbe, mit der die Buchstaben
/// neben dem Kreuz gezeichnet werden</summary>
Brush brush;

int anzX = 4;
int anzY = 5;
int abstandX = 50;
int abstandY = 30;

/// <summary>Radius des Kreuzes</summary>
int kRad = 5;

/// <summary>X-Abstand der Buchstaben vom Punkt</summary>
int xPunktAbstand = 10;

/// <summary>Skalierung der gesamten Grafik. 1=nicht
skaliert.</summary>
float gesamtSkalierung = 1;

float fontGrössePunktBeschreibung = 6.0F;
Font punktBeschreibungsFont;

public class Codes
{
private double x;
private double y;
private int boardNumber;

public double X
{
get { return x; }
set { x = value; }
}

public double Y
{
get { return y; }
set { y = value; }
}

public PointF GetPointF()
{
return new PointF((float)x, (float)y);
}

public int BoardNumber
{
get { return boardNumber; }
set { boardNumber = value; }
}

public Codes(double x, double y, int boardNumber)
{
this.x = x;
this.y = y;
this.boardNumber = boardNumber;
}
}
#endregion

Origin _origin = Origin.TopLeft;

public ucProductlistView()
{
InitializeComponent();

ListCodesFüllen(ref listCodes, anzX, anzY, abstandX, abstandY);
//brush = new SolidBrush(this.ForeColor);
brush = new SolidBrush(Color.Red);

punktBeschreibungsFont = new Font("Arial",
fontGrössePunktBeschreibung);
}

private void ListCodesFüllen(ref List<Codes> listCodes, int
anzX, int anzY, int abstandX, int abstandY)
{
listCodes = new List<Codes>();
Codes codes;
int boardNumber = 0;

for (int x = 0; x < anzX; x++)
{
for (int y = 0; y < anzY; y++)
{
boardNumber++;
codes = new Codes(x * abstandX, y * abstandY,
boardNumber);
listCodes.Add(codes);
}
}
}

float zollAlsMillimeter = 25.4F;

PointF MillimeterToPixelPointF(Graphics g, PointF p)
{
p.X *= g.DpiX / zollAlsMillimeter;
p.Y *= g.DpiY / zollAlsMillimeter;
return p;
}

private void panel_draw_Paint(object sender, PaintEventArgs e)
{
_origin = Origin.TopRight;

base.OnPaint(e);

Graphics g = e.Graphics;
PointF ptCur;
string strPoint;
// momentan keine Auswirkung
//g.ScaleTransform(gesamtSkalierung, gesamtSkalierung);

ptCur = new PointF();
foreach (Codes code in listCodes)
{
//ptCur = MillimeterToPixelPointF(g, code.GetPointF());

// Zeichnen der zwei Linien, die das Kreuz bilden
g.DrawLine(Pens.Black, ptCur.X - kRad, ptCur.Y, ptCur.X
+ kRad, ptCur.Y);
g.DrawLine(Pens.Black, ptCur.X, ptCur.Y - kRad,
ptCur.X, ptCur.Y + kRad);

// Buchstaben und Bezeichnungen für den Punkt zeichnen
strPoint = "P" + code.BoardNumber + "(" + code.X + ","
+ code.Y + ")";
//g.DrawString(strPoint, Font, brush, ptCur.X +
xPunktAbstand, ptCur.Y);
g.DrawString(strPoint, punktBeschreibungsFont, brush,
ptCur.X + xPunktAbstand, ptCur.Y);
}

//####################### ALLES in mm dann transformieren
###########################
//oder?

switch (_origin)
{
case Origin.TopLeft:
{
Matrix m = new Matrix();
m.Translate(0, 0);
m.Scale(1, 1);
e.Graphics.Transform = m;
break;
}
case Origin.TopRight:
{
Matrix m = new Matrix();
m.Translate(fWidth - 1, 0);
//m.Scale(-1, 1);
m.Scale(-g.DpiX / zollAlsMillimeter, g.DpiY /
zollAlsMillimeter);
e.Graphics.Transform = m;
break;
}
case Origin.BottomLeft:
{
Matrix m = new Matrix();
m.Translate(0, fHeight - 1);
m.Scale(1, -1);
e.Graphics.Transform = m;
break;
}
case Origin.BottomRight:
{
Matrix m = new Matrix();
m.Translate(fWidth - 1, fHeight - 1);
m.Scale(-1, -1);
e.Graphics.Transform = m;
break;
}
}

}
}
}
 

Lesen sie die antworten

#1 Petra Rohmer
03/11/2007 - 10:14 | Warnen spam
Hallo,

Nachtrag<


ich möchte die Punkte in das Windows Panel -> 'panel_draw' zeichnen.
Am einfachsten wàre es ja alles in mm, danach wandle ich in Pixel um.
Das bewahrt die Übersicht.
Der Fehler ist irgendwo hier zu suchen.
float scaleX = (float)panel_draw.DisplayRectangle.Width /
Math.Abs(fWidth);
float scaleY = (float)panel_draw.DisplayRectangle.Height /
Math.Abs(fHeight);

Wie macht man das richtig?

Grüße Petra

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace ucProductlistView
{
public partial class ucProductlistView : UserControl
{
//*****************************************************************************
public enum Origin
{
TopLeft,
TopRight,
BottomLeft,
BottomRight
}

//--
const float fX = 0;
const float fY = 0;
const float fWidth = 900;
const float fHeight = 500;


#region Punkte Liste
public List<Codes> listCodes;

/// <summary>Die Farbe, mit der die Buchstaben
/// neben dem Kreuz gezeichnet werden</summary>
Brush brush;

int anzX = 4;
int anzY = 5;
int abstandX = 50;
int abstandY = 30;

/// <summary>Radius des Kreuzes</summary>
int kRad = 5;

/// <summary>X-Abstand der Buchstaben vom Punkt</summary>
int xPunktAbstand = 10;

/// <summary>Skalierung der gesamten Grafik. 1=nicht
skaliert.</summary>
float gesamtSkalierung = 1;

float fontGrössePunktBeschreibung = 6.0F;
Font punktBeschreibungsFont;

public class Codes
{
private double x;
private double y;
private int boardNumber;

public double X
{
get { return x; }
set { x = value; }
}

public double Y
{
get { return y; }
set { y = value; }
}

public PointF GetPointF()
{
return new PointF((float)x, (float)y);
}

public int BoardNumber
{
get { return boardNumber; }
set { boardNumber = value; }
}

public Codes(double x, double y, int boardNumber)
{
this.x = x;
this.y = y;
this.boardNumber = boardNumber;
}
}
#endregion

Origin _origin = Origin.TopLeft;

public ucProductlistView()
{
InitializeComponent();

ListCodesFüllen(ref listCodes, anzX, anzY, abstandX, abstandY);
//brush = new SolidBrush(this.ForeColor);
brush = new SolidBrush(Color.Red);

punktBeschreibungsFont = new Font("Arial",
fontGrössePunktBeschreibung);
}

private void ListCodesFüllen(ref List<Codes> listCodes, int
anzX, int anzY, int abstandX, int abstandY)
{
listCodes = new List<Codes>();
Codes codes;
int boardNumber = 0;

for (int x = 0; x < anzX; x++)
{
for (int y = 0; y < anzY; y++)
{
boardNumber++;
codes = new Codes(x * abstandX, y * abstandY,
boardNumber);
listCodes.Add(codes);
}
}
}

float zollAlsMillimeter = 25.4F;

PointF MillimeterToPixelPointF(Graphics g, PointF p)
{
p.X *= g.DpiX / zollAlsMillimeter;
p.Y *= g.DpiY / zollAlsMillimeter;
return p;
}

private void panel_draw_Paint(object sender, PaintEventArgs e)
{
_origin = Origin.TopRight;

base.OnPaint(e);

Graphics g = e.Graphics;
PointF ptCur;
string strPoint;
// momentan keine Auswirkung
g.ScaleTransform(gesamtSkalierung, gesamtSkalierung);

ptCur = new PointF();
foreach (Codes code in listCodes)
{
ptCur = MillimeterToPixelPointF(g, code.GetPointF());

// Zeichnen der zwei Linien, die das Kreuz bilden
g.DrawLine(Pens.Black, ptCur.X - kRad, ptCur.Y, ptCur.X
+ kRad, ptCur.Y);
g.DrawLine(Pens.Black, ptCur.X, ptCur.Y - kRad,
ptCur.X, ptCur.Y + kRad);

// Buchstaben und Bezeichnungen für den Punkt zeichnen
strPoint = "P" + code.BoardNumber + "(" + code.X + ","
+ code.Y + ")";
//g.DrawString(strPoint, Font, brush, ptCur.X +
xPunktAbstand, ptCur.Y);
g.DrawString(strPoint, punktBeschreibungsFont, brush,
ptCur.X + xPunktAbstand, ptCur.Y);
}



float scaleX = (float)panel_draw.DisplayRectangle.Width /
Math.Abs(fWidth);
float scaleY = (float)panel_draw.DisplayRectangle.Height /
Math.Abs(fHeight);

switch (_origin)
{
case Origin.TopLeft:
{
Matrix m = new Matrix();
m.Translate(0, 0);
m.Scale(1, 1);
e.Graphics.Transform = m;
break;
}
case Origin.TopRight:
{
Matrix m = new Matrix();
m.Translate(fWidth - 1, 0);
//m.Scale(-1, 1);
m.Scale(scaleX, scaleY);
e.Graphics.Transform = m;
break;
}
case Origin.BottomLeft:
{
Matrix m = new Matrix();
m.Translate(0, fHeight - 1);
m.Scale(1, -1);
e.Graphics.Transform = m;
break;
}
case Origin.BottomRight:
{
Matrix m = new Matrix();
m.Translate(fWidth - 1, fHeight - 1);
m.Scale(-1, -1);
e.Graphics.Transform = m;
break;
}
}

}
}
}

Ähnliche fragen