【问题标题】:converting double values for making a Point type转换双精度值以创建 Point 类型
【发布时间】:2011-03-20 03:51:52
【问题描述】:

我想使用 imagefrom bitmap 在图片框中绘制一条曲线(二极管曲线)。我现在有一个问题,我的点数据被保存为双精度,保持精度非常重要。

例如,我所拥有的情节中的一个点是这样的:

电压:-0.175 电流:-9.930625E-06

是的,它是双倍!现在我该怎么做,例如:

        Point[] ptarray = new Point[3];
        ptarray[0] = new Point(250, 250);

是否有替代 Point[] 接受双精度值的替代方法?我有一个 500x500 的图片框。有没有办法将这些值转换为仍然可以保存进动的有效点?我正在使用微安培 (10^-6) 和电压!

【问题讨论】:

    标签: c# double point


    【解决方案1】:

    好吧,如果float足够精确,那么你可以使用PointF struct

    var point = new PointF(3.5f, 7.9f);
    

    如果你真的需要,你可以定义自己的PointD struct:

    public struct PointD {
        public double X;
        public double Y;
    
        public PointD(double x, double y) {
            X = x;
            Y = y;
        }
    
        public Point ToPoint() {
            return new Point((int)X, (int)Y);
        }
    
        public override bool Equals(object obj) {
          return obj is PointD && this == (PointD)obj;
        }
        public override int GetHashCode() {
          return X.GetHashCode() ^ Y.GetHashCode();
        }
        public static bool operator ==(PointD a, PointD b) {
          return a.X == b.X && a.Y == b.Y;
        }
        public static bool operator !=(PointD a, PointD b) {
          return !(a == b);
        }
    }
    

    等式代码最初来自here

    ToPoint() 方法允许您将其转换为 Point 对象,当然精度会被截断。

    【讨论】:

    【解决方案2】:

    如果只是为了存储这些值,总会有Tuple

    Tuple<double, double>[] Points = new Tuple<double, double>[50];
    Points[0] = Tuple.Create<double, double>(5.33, 12.45);
    

    【讨论】:

    • 元组不添加任何上下文并且是通用的方式并且使代码难以阅读。我会说将它们作为最后的手段。
    【解决方案3】:

    虽然System.Drawing.Point 结构体使用int 值,System.Drawing.PointF 结构体使用float 值,但还有System.Windows.Point 结构体使用double 值。因此,如果 float 无法提供足够的精度来满足您的需求,这可能是您的最佳选择。

    但是,由于结构的名称与基于 int 的结构的名称冲突,因此在已经包含 using System.Drawing 指令的文件中使用它可能会很笨拙:

    using System.Drawing;
    ...
    System.Windows.Point coords = new System.Windows.Point(1.5, 3.9);
    

    幸运的是,您可以通过使用别名来解决这个问题:

    using System.Drawing;
    using PointD = System.Windows.Point;
    ...
    PointD coords = new PointD(1.5, 3.9);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2015-02-12
      • 1970-01-01
      相关资源
      最近更新 更多