C# 需要基于点计数、间隔和图表区域确定标记大小的逻辑

C# 需要基于点计数、间隔和图表区域确定标记大小的逻辑,c#,mschart,C#,Mschart,我正在绘制xy点图。我需要选择标记大小,以便根据图表面积、总xy点计数以及X轴和Y轴上点之间的最小间隔,点不会相互重叠 目前我是这样做的: int marginWidth = chart1.Size.Width; int marginHeight = chart1.Size.Height; chart1.Series[0].MarkerSize = (((marginWidth * marginHeight) / (marginWidth + marginHeight)) /18) 18只是

我正在绘制xy点图。我需要选择标记大小,以便根据图表面积、总xy点计数以及X轴和Y轴上点之间的最小间隔,点不会相互重叠

目前我是这样做的:

int marginWidth = chart1.Size.Width;
int marginHeight = chart1.Size.Height;

chart1.Series[0].MarkerSize = (((marginWidth * marginHeight) / (marginWidth + marginHeight)) /18)
18只是大约100个xy点的校准值。但很明显,当点数增加时,需要减小标记大小以获得更好的可见性


有人能给我一个逻辑吗?

我看到了一个简单的解决方案:根据您的数据设置标记大小。因此,您应该将chart1.Series[0].Count或类似的内容改为=

尝试计算两个标记之间的距离 Markersize=距离

//chart object PrePaint event...     
private void chart1_PrePaint(object sender, ChartPaintEventArgs e)
    {

        //get the PixelPosition of first Marker
        double X1 = chart1.ChartAreas[0].AxisX.ValueToPixelPosition(1); //X 
        double Y1 = chart1.ChartAreas[0].AxisY.ValueToPixelPosition(1); //Y
        //get the PixelPosition of second Marker(X-Axis)
        double X2 = chart1.ChartAreas[0].AxisX.ValueToPixelPosition(2); //X
        double Y2 = chart1.ChartAreas[0].AxisY.ValueToPixelPosition(1); //Y
        //get the PixelPosition of second Marker(Y-Axis)
        double X3 = chart1.ChartAreas[0].AxisX.ValueToPixelPosition(1); //X
        double Y3 = chart1.ChartAreas[0].AxisY.ValueToPixelPosition(2); //Y
        //Calculate the Distance by Pythagoras (c² = a² + b²)
        //=> a² = (X1 - X2)² && b² = (Y1-Y2)²
        //Sorry is in german but the video explain
        //http://matheguru.com/lineare-algebra/224-abstand-zwischen-zwei-punkten.html
        double disctanceX = Math.Sqrt(Math.Pow(X1 - X2, 2) + Math.Pow(Y1 - Y2, 2));
        double disctanceY = Math.Sqrt(Math.Pow(X1 - X3, 2) + Math.Pow(Y1 - Y3, 2));

        //limit the marker at smaller value
        if (disctanceX < disctanceY)
        {
                                          //cut the decimals other routines are possible
            chart1.Series[0].MarkerSize = (int) Math.Ceiling(disctanceX);
        }
        else
        {
            chart1.Series[0].MarkerSize = (int) Math.Ceiling(disctanceY);
        }
    }

请不要把C mschart之类的东西放在你的标题中。只需使用标签即可。有时点数范围在2-2000之间。每当图表调整大小时,标记大小都需要根据图表区域调整大小,以获得更好的可视性。我只需要逻辑我怎么能包括计数公式欢迎堆栈溢出!虽然代码是值得赞赏的,但它应该始终有一个附带的解释。这不需要很长,一行就可以了,但它是必需的。我从审核队列到达这里,因为这是自动标记的。保持高质量的答案将有助于防止这种情况的发生。我希望这能让你满意