屏幕划线,通过平面坐标系实现,基本组成是一个一个的点,起点为A,终点为B

本文的算法,可以实现平面栅格中,指定的A,B两点之间进行连线(代码中仅打印了两点间需要画出的坐标点)

#include <iostream>
#include <algorithm>
using namespace std; void paint(int,int);
void paint(int i,int j){ //画出点位
cout<<i<<",,"<<j<<endl;
}
int main () { int A[] = {7,2};//起点
int B[]={7,2};//终点 int Ax=-1,Ay=-1,Bx=-1,By=-1;
Ax=A[0];
Ay=A[1];
Bx=B[0];
By=B[1];
int width,height,left=-1,times=-1,shu=-1;
width=abs(Ax-Bx)+1;
height=abs(Ay-By)+1;
if(width>height){
shu=0;
times=width/height;
cout<<"0times"<<times<<endl;
left=width%height;
cout<<"0left"<<left<<endl;
}else if(width<height){
shu=1;
times=height/width;
cout<<"1times"<<times<<endl;
left=height%width;
cout<<"1left"<<left<<endl;
}else{
shu=2;
}
if(Ax>Bx){
if(Ay>By){
if(shu==2){
for(int i=0;i<height;i++){
paint(Bx+i,By+i);
}
}else if(shu==1){
for(int i=0;i<width;i++){
if(left>0){
for(int j=0;j<times+1;j++){ paint(Bx,By);
By+=1;
}
Bx+=1;
}else{
for(int j=0;j<times;j++){ paint(Bx,By);
By+=1;
}
Bx+=1;
}
left-=1;
}
}else{
for(int i=0;i<height;i++){
if(left>0){
for(int i=0;i<times+1;i++){ paint(Bx,By);
Bx+=1;
}
By+=1;
}else{
for(int j=0;j<times;j++){ paint(Bx,By);
Bx+=1;
}
By+=1;
}
left-=1;
}
}
}else if(Ay<By){
if(shu==2){
for(int i=0;i<height;i++){
paint(Bx+i,By-i);
}
}else if(shu==1){
for(int i=0;i<width;i++){
if(left>0){
for(int j=0;j<times+1;j++){ paint(Bx,By);
By-=1;
}
Bx+=1;
}else{
for(int j=0;j<times;j++){ paint(Bx,By);
cout<<"dede"<<endl;
By-=1;
}
Bx+=1;
}
left-=1;
}
}else{
for(int i=0;i<height;i++){
if(left>0){
for(int i=0;i<times+1;i++){ paint(Bx,By);
Bx+=1;
}
By-=1;
}else{
for(int j=0;j<times;j++){ paint(Bx,By);
Bx+=1;
}
By-=1;
}
left-=1;
}
}
}else{
for(int i=0;i<width;i++){
paint(Bx+i,By);
}
}
}else if(Ax<Bx){
if(Ay>By){
if(shu==2){
for(int i=0;i<height;i++){
paint(Ax+i,Ay-i);
}
}else if(shu==1){
for(int i=0;i<width;i++){
if(left>0){
for(int j=0;j<times+1;j++){ paint(Ax,Ay);
Ay-=1;
}
Ax+=1;
}else{
for(int j=0;j<times;j++){ paint(Ax,Ay);
Ay-=1;
}
Ax+=1;
}
left-=1;
}
}else{
for(int i=0;i<height;i++){
if(left>0){
for(int i=0;i<times+1;i++){ paint(Ax,Ay);
Ax+=1;
}
Ay-=1;
}else{
for(int j=0;j<times;j++){ paint(Ax,Ay);
Ax+=1;
}
Ay-=1;
}
left-=1;
}
}
}else if(Ay<By){
if(shu==2){
for(int i=0;i<height;i++){
paint(Ax+i,Ay+i);
}
}else if(shu==1){
for(int i=0;i<width;i++){
if(left>0){
for(int j=0;j<times+1;j++){
paint(Ax,Ay);
Ay+=1;
}
Ax+=1;
}else{
for(int k=0;k<times;k++){ paint(Ax,Ay);
Ay+=1;
}
Ax+=1;
}
left-=1;
}
}else{
for(int i=0;i<height;i++){
if(left>0){
for(int i=0;i<times+1;i++){ paint(Ax,Ay);
Ax+=1;
}
Ay+=1;
}else{
for(int j=0;j<times;j++){ paint(Ax,Ay);
Ax+=1;
}
Ay+=1;
}
left-=1;
}
}
}else{
for(int i=0;i<width;i++){
paint(Ax+i,Ay);
}
}
}else{
if(Ay>By){
for(int i=0;i<height;i++){
paint(Bx,By+i);
}
}else if(Ay<By){
for(int i=0;i<height;i++){
paint(Ax,Ay+i);
}
}else{
for(int i=0;i<width;i++){
paint(Ax,Ay);
}
}
}
return 0;
}

c++ 算法 栅格中两点之间连线的更多相关文章

  1. 武汉科技大学ACM :1006: 零起点学算法25——求两点之间的距离

    Problem Description 输入平面坐标系中2点的坐标,输出它们之间的距离 Input 输入4个浮点数x1 y1 x2 y2,分别是点(x1,y1) (x2,y2)的坐标(多组数据) Ou ...

  2. Floyd算法——计算图中任意两点之间的最短路径

    百度百科定义:传送门 一.floyd算法 说实话这个算法是用来求多源最短路径的算法. 算法原理: 1,从任意一条单边路径开始.所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大. 2,对 ...

  3. Geotools求shapefile路网中任意两点之间最短路径的距离

    前言:之前在博问求助过这个问题.经过几天的思考,算是解决了(但仍有不足),另一方面对Geotools不是很熟,有些描述可能不正确,希望大家批评指正. 问题:作为一个新手,我并没有发现Geotools中 ...

  4. 2D和3D空间中计算两点之间的距离

    自己在做游戏的忘记了Unity帮我们提供计算两点之间的距离,在百度搜索了下. 原来有一个公式自己就写了一个方法O(∩_∩)O~,到僵尸到达某一个点之后就向另一个奔跑过去 /// <summary ...

  5. Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离

    Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离,既不是DFS搜索,也不是BFS搜索. 把Dijkstra 算法应用于无权图,或者所有边的权都相等的图,Dijkstra 算法等同于 ...

  6. ArcEngine中合并断开的线要素(根据几何判断)

    在上一篇ArcEngine环境下合并断开的线要素(根据属性)随笔中介绍了如何通过shp文件属性表中相同的属性字段进行线要素的合并.今天刚把通过几何条件判断的方式连接断开的线要素的ArcGIS 插件完成 ...

  7. C#面向对象思想计算两点之间距离

    题目为计算两点之间距离. 面向过程的思维方式,两点的横坐标之差,纵坐标之差,平方求和,再开跟,得到两点之间距离. using System; using System.Collections.Gene ...

  8. [CareerCup] 4.2 Route between Two Nodes in Directed Graph 有向图中两点的路径

    4.2 Given a directed graph, design an algorithm to find out whether there is a route between two nod ...

  9. (转)c# math 计算两点之间的角度公式

    计算两点之间的角度公式是: 假设点一(X1,Y1),点二(X2,Y2) double angleOfLine = Math.Atan2((Y2 - Y1), (X2 - X2)) * 180 / Ma ...

随机推荐

  1. PAT 1029 Median[求中位数][难]

    1029 Median(25 分) Given an increasing sequence S of N integers, the median is the number at the midd ...

  2. siblings()

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. [LeetCode] 589. N-ary Tree Preorder Traversal_Easy

    Given an n-ary tree, return the preorder traversal of its nodes' values. For example, given a 3-ary  ...

  4. 最新可靠好用的DNS服务器地址汇总

    如果修改DNS服务器地址就可以访问google等服务,你还等什么?使用免费DNS解析服务除了去掉了运营商的各种广告,还有个最大的好处就是不会重定向或者过滤用户所访问的地址,这样就防止了很多网站被电信. ...

  5. 梯度消失与梯度爆炸 ==> 如何选择随机初始权重

    梯度消失与梯度爆炸 当训练神经网络时,导数或坡度有时会变得非常大或非常小,甚至以指数方式变小,这加大了训练的难度 这里忽略了常数项b.为了让z不会过大或者过小,思路是让w与n有关,且n越大,w应该越小 ...

  6. STL学习笔记--特殊容器

    容器配接器 (1) stack 栈 后进先出(LIFO), 头文件#include<stack> template<class _Ty, class _Container = deq ...

  7. TFS修改映射路径办法

    如果你之前配置好了TFS项目的映射路径.然后每次下载项目都会在你配置的路径,但我们可以修改 方法一:我们可以在 "工作区" 中修改路径

  8. linux printf

    [root@LocalWeb01 ~]# printf '%s%s%s\n' 1 2 3 41234 [root@LocalWeb01 ~]# printf '%s%s%s' 1 2 3 41234 ...

  9. js 数组操作

    toString():把数组转换成一个字符串 toLocaleString():把数组转换成一个字符串 join():把数组转换成一个用符号连接的字符串 shift():将数组头部的一个元素移出 un ...

  10. nodepad++ 标签栏无法拖放标签

    nodepad++ 标签栏无法拖放标签设置--首选项--常用--标签栏--锁定(不允许拖放) 去掉这个勾 ps:最近版本的不知道为什么这个设置不生效了,没找到原因,可能是bug,只能等待升级解决了(升 ...