2016-04-22 8 views
0

Ich muss Rechtecke mit verschiedenen Höhen und Breiten in einer C# -Anwendung darstellen. Die Rechtecke können sich überlappen oder nicht.Chart Rechtecke beliebiger Abmessungen

Ich dachte, die System.Windows.Forms.DataVisualization.Charting hätte, was ich brauche, aber jeder Diagrammtyp, den ich erkundet habe, will Datenpunkte, die aus einem einzigen Wert in einer Dimension und mehreren Werten in der anderen Dimension bestehen.

Ich habe überlegt: Box, Bubble, and Range Bar.

+0

Gewusst wie: Zeichnen Sie ein gefülltes Rechteck auf einem Windows-Formular: https://msdn.microsoft.com/en-us/library/ztxk24yx(v=vs.110).aspx – Vertexwahn

+0

Ich formulierte das OP. Ich brauche mehr als Rechtecke auf dem Bildschirm. Es muss in einem Diagramm sein, dass ein Benutzer hinein- und hinauszoomen kann usw. –

+0

Dieses Forum ist nicht hier, um Ihnen zu helfen, eine Bibliothek zu finden. Wenn Sie also nicht planen, dies selbst zu implementieren, sollten Sie sich irgendwo anders umsehen. – Glubus

Antwort

0

Es stellt sich heraus, dass Richard Eriksson die engste Antwort darin hat, dass das Charting-Paket nicht das enthält, was ich brauchte. Die Lösung, mit der ich fortfahre, ist die Verwendung eines Punktdiagramms zum Verwalten von Achsen und ähnlichem, aber das PostPaint-Ereignis überladen, um die Rechtecke, die ich brauche, effektiv oben zu zeichnen. Das Diagramm bietet Umwandlungen von Wert zu Pixel (und umgekehrt).

0

Hier ist ein minimales Beispiel, dass 100 Quadrate in verschiedenen Farben und Größen wirft zufällig auf eine Chart von ChartType Point mit benutzerdefiniertenMarker Images.

enter image description here

können Sie ändern die Datenpunkte von den Farben zu entkoppeln, damit für alle Größen oder Formen etc ..:

int count = 100; 
int mSize = 60;       // marker size 
List<Color> colors = new List<Color>(); // a color list 
for (int i = 0; i < count; i++) 
    colors.Add(Color.FromArgb(255, 255 - i * 2, (i*i) %256, i*2)); 

Random R = new Random(99); 

for (int i = 0; i < count; i++) // create and store the marker images 
{ 
    int w = 10 + R.Next(50);  // inner width of visible marker 
    int off = (mSize - w)/2; 
    Bitmap bmp = new Bitmap(mSize, mSize); 
    using (Graphics G = Graphics.FromImage(bmp)) 
    { 
     G.Clear(Color.Transparent); 
     G.FillRectangle(new SolidBrush(colors[i]), off, off, w, w); 
     chart5.Images.Add(new NamedImage("NI" + i, bmp)); 
    } 
} 

for (int i = 0; i < count; i++) // now add a few points to random locations 
{ 
    int p = chart5.Series["S1"].Points.AddXY(R.Next(100), R.Next(100)); 
    chart5.Series["S1"].Points[p].MarkerImage = "NI" + p; 
} 

Hinweis, dass dies wirklich nur ein schnelles eins; in der Link to the original answer about a heat map Ich zeige, wie zu Größe die Markers zusammen mit der Chart. Hier werden sie immer die gleiche Größe bleiben ..:

enter image description here

Ich senkte haben die Alpha der Farben für dieses Bild 255-155, btw.

Die Größen bleiben auch beim Zoomen auf Chart fixiert; sehen, wie schön sie auseinander driften, so können Sie den Raum zwischen ihnen sehen:

enter image description here

Dies kann oder kann nicht sein, was Sie wollen, natürlich ..

Bitte beachte, dass ich behinderte hatte beide Axes in den ersten Bildern für ein netteres Aussehen. Zum Zoomen habe ich sie wieder eingeschaltet, damit ich die einfache Reset-Taste bekomme.

Beachten Sie auch, dass Posting die Screenshots hier einige Größenanpassungen einführt, die nicht aus dem Diagramm kommen!