找出所有点:
根据斜率按照一个方向递增,求出对应的另一个方向的整数值。
Point pStart = new Point(0, 2); Point pEnd = new Point(8, 2); //定义线上的点 List<Point> linePoint = new List<Point>(); //定义x坐标的大小 Point pointMaxX = new Point(); Point pointMinX = new Point(); //给x坐标大的点和小的点赋值 if (Math.Max(pStart.X, pEnd.X) == pStart.X) { pointMaxX = pStart; pointMinX = pEnd; } else { pointMaxX = pEnd; pointMinX = pStart; } // 循环x坐标(循环满足x坐标为整数的y坐标)或者y坐标均可 for (int i = pointMinX.X + 1; i < pointMaxX.X; i++) { // 计算斜率 double k = ((double)(pointMinX.Y - pointMaxX.Y)) / (pointMinX.X - pointMaxX.X); // 根据斜率,计算y坐标 double y = k * (i - pointMinX.X) + pointMinX.Y; // 简单判断一下y是不是整数 double d = y - (int)y; if (0.001 > d && d > -0.001) { linePoint.Add(new Point(i,(int)d)); } } //打印点 foreach (var item in linePoint) { Console.WriteLine(item.X + @"," + item.Y); }
画线
依据某个端点,找出这个端点方向的下一个三个周围点,找出最符合斜率的点。
public bool DrawLineOnPicture(Color c, Point start, Point end) { if (MyBitmapData == null) { return false; } int x, y; int dstStride = MyBitmapData.Stride; //Object thisLock = new Object(); //lock (thisLock){ System.IntPtr dstScan0 = MyBitmapData.Scan0; try { if (start.X > end.X) { Point temp = start; start = end; end = temp; } int step; if (start.Y < end.Y) step = 1; else step = -1; x = start.X; y = start.Y; unsafe { byte* pDst = (byte*)(void*)dstScan0; while ((x != end.X) || (y != end.Y)) { pDst[x * 3 + y * dstStride] = c.R; pDst[x * 3 + y * dstStride + 1] = c.G; pDst[x * 3 + y * dstStride + 2] = c.B; Point p1 = new Point(x + 1, y); Point p2 = new Point(x, y + step); Point p3 = new Point(x + 1, y + step); double distance1 = DistanceToLine(p1, start, end); double distance2 = DistanceToLine(p2, start, end); double distance3 = DistanceToLine(p3, start, end); double distance = Math.Min(Math.Min(distance1, distance3), distance2); if (distance == distance1) { x = p1.X; y = p1.Y; } else if (distance == distance2) { x = p2.X; y = p2.Y; } else { x = p3.X; y = p3.Y; } } } } catch (Exception ) { //DBConnection.LevelTrace(TraceLevel.Error, "MyImage-->DrawLineOnPicture failed with:" + e); return false; } //} return true; }
private double DistanceToLine(Point p, Point lineStart, Point lineEnd) { if (lineStart.X == lineEnd.X) return (Math.Abs(p.X - lineEnd.X)); else if (lineStart.Y == lineEnd.Y) return (Math.Abs(p.Y - lineEnd.Y)); else { double a = 1.0 * (lineEnd.Y - lineStart.Y) / (lineEnd.X - lineStart.X); double b = lineStart.Y - a * lineStart.X; double b2 = p.Y - a * p.X; return (Math.Abs(b2 - b)); } }