winform 根据两点求出线上所有点及画出这条线
找出所有点:
根据斜率按照一个方向递增,求出对应的另一个方向的整数值。
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));
}
}
winform 根据两点求出线上所有点及画出这条线的更多相关文章
- 机器学习入门-数值特征-数据四分位特征 1.quantile(用于求给定分数位的数值) 2.plt.axvline(用于画出竖线) 3.pd.pcut(对特征进行分位数切分,生成新的特征)
函数说明: 1. .quantile(cut_list) 对DataFrame类型直接使用,用于求出给定列表中分数的数值,这里用来求出4分位出的数值 2. plt.axvline() # 用于画 ...
- p点到(a,b)点两所在直线的垂点坐标及p点是否在(a,b)两点所在直线上
/// <summary> /// p点到(a,b)点两所在直线的垂点坐标 /// </summary> /// <p ...
- TZOJ 1689 Building A New Barn(求平面上有几个其它点求到n个点的曼哈顿距离最小)
描述 After scrimping and saving for years, Farmer John has decided to build a new barn. He wants the b ...
- hdu 5017 模拟退火/三分求椭圆上离圆心最近的点的距离
http://acm.hdu.edu.cn/showproblem.php?pid=5017 求椭圆上离圆心最近的点的距离. 模拟退火和三分套三分都能解决 #include <cstdio> ...
- 由两点坐标如何画出直线 matlab
由两点坐标如何画出直线 方法1:利用直线方程 斜率加截距 方法2:数据拟合 %由两点坐标得数据拟合直线与画线 x = [,]; y = [,]; k = ((-)/(-));% 由两点坐标得到直线斜 ...
- c编程:求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。
//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max, ...
- Android中Google地图路径导航,使用mapfragment地图上画出线路(google map api v2)详解
在这篇里我们只聊怎么在android中google map api v2地图上画出路径导航,用mapfragment而不是mapview,至于怎么去申请key,manifest.xml中加入的权限,系 ...
- java绘图原理------在窗口界面(或面板上)画出一张或多张图片问题解决方法
/** *@author blovedr * 功能: java绘图原理------在窗口界面(或面板上)画出一张或多张图片问题解决方法 * 日期: 2018年4月28日 16:20 * 注释: ...
- 使用JavaScript在Canvas上画出一片星空
随着Html5的迅猛发展,画布也变得越来越重要.下面我就写一个关于在canvas上画出一片星空的简单的代码的示例. 理论基础 初始化一个canvas,获得一个用于绘制图形的上下文环境context.并 ...
随机推荐
- 零基础Python知识点回顾(一)
如果你是小白,建议只要安装官网的python-3.7.0-amd64.exe 然后在电脑cmd命令提示符 输入检查是否已经安装pip,一般安装了python都会有的. >pip ...
- Java四舍五入时保留指定小数位数
方式一: double f = 3.1516; BigDecimal b = new BigDecimal(f); , BigDecimal.ROUND_HALF_UP).doubleValue(); ...
- 你应该要知道的JS中的this
前言 this 是 JavaScript 中不可不谈的一个知识点,它非常重要但又不容易理解.因为 JavaScript 中的 this 不同于其他语言.不同场景下的 this 指向不同(当函数被调用执 ...
- thinkphp5一些文件夹用法
一.vendor通常放一些第三方的文件,如短信.支付宝等.用法: 1.在vendor中建一个文件夹: 2.在文件夹中新建一个类:主要命名空间(没有vendor ):如下面: 3.在控制器中调用,除了通 ...
- python七类之字典详解
一.字典 一.关键字:dict 1.字典是唯一的键值对数据,其表现形式: dic = {键:值},字典里的键必须保证是唯一的 2.键必须是不可变的数据类型: a.故列表是不能当键的 b.所 ...
- 数列分块入门 1 LOJ6277
题目描述 给出一个长为 n 的数列,以及 n 个操作,操作涉及区间加法,单点查值. 输入格式 第一行输入一个数字 n. 第二行输入 n 个数字,第 iii 个数字为 ai,以空格隔开. 接下来输 ...
- 【python3.X】python练习笔记[1]
##三位数水仙花 ##方法一,小于指定数字的水仙花数 x=eval(input()) a,b,c = 0,0,0 for i in range (100,x,1): a=i%10 b=i//100 c ...
- Eclipse AmaterasUML 安装及使用
AmaterasUML 对于我来说,是一个非常好用的UML插件. 用它来将我写过的一些Android程序进行逆工程非常好用,只不过,不能体现出包,这是一个小小的遗憾. 这个是它的主页地址:http:/ ...
- mvc4 Forms验证存储 两种登录代码
自己也不知道网上看到的第一种居多,第二种用到的人很少,第二种代码十分简洁,就是不清楚是否有安全隐患. 要采用Forms身份验证,先要在应用程序根目录中的Web.config中做相应的设置: <a ...
- linux内存
在Linux的世界中,从大的方面来讲,有两块内存,一块叫做内存空间,Kernel Space,另一块叫做用户空间,即User Space.它们是相互独立的,Kernel对它们的管理方式也完全不同 驱动 ...