c++ 算法 栅格中两点之间连线
屏幕划线,通过平面坐标系实现,基本组成是一个一个的点,起点为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++ 算法 栅格中两点之间连线的更多相关文章
- 武汉科技大学ACM :1006: 零起点学算法25——求两点之间的距离
Problem Description 输入平面坐标系中2点的坐标,输出它们之间的距离 Input 输入4个浮点数x1 y1 x2 y2,分别是点(x1,y1) (x2,y2)的坐标(多组数据) Ou ...
- Floyd算法——计算图中任意两点之间的最短路径
百度百科定义:传送门 一.floyd算法 说实话这个算法是用来求多源最短路径的算法. 算法原理: 1,从任意一条单边路径开始.所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大. 2,对 ...
- Geotools求shapefile路网中任意两点之间最短路径的距离
前言:之前在博问求助过这个问题.经过几天的思考,算是解决了(但仍有不足),另一方面对Geotools不是很熟,有些描述可能不正确,希望大家批评指正. 问题:作为一个新手,我并没有发现Geotools中 ...
- 2D和3D空间中计算两点之间的距离
自己在做游戏的忘记了Unity帮我们提供计算两点之间的距离,在百度搜索了下. 原来有一个公式自己就写了一个方法O(∩_∩)O~,到僵尸到达某一个点之后就向另一个奔跑过去 /// <summary ...
- Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离
Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离,既不是DFS搜索,也不是BFS搜索. 把Dijkstra 算法应用于无权图,或者所有边的权都相等的图,Dijkstra 算法等同于 ...
- ArcEngine中合并断开的线要素(根据几何判断)
在上一篇ArcEngine环境下合并断开的线要素(根据属性)随笔中介绍了如何通过shp文件属性表中相同的属性字段进行线要素的合并.今天刚把通过几何条件判断的方式连接断开的线要素的ArcGIS 插件完成 ...
- C#面向对象思想计算两点之间距离
题目为计算两点之间距离. 面向过程的思维方式,两点的横坐标之差,纵坐标之差,平方求和,再开跟,得到两点之间距离. using System; using System.Collections.Gene ...
- [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 ...
- (转)c# math 计算两点之间的角度公式
计算两点之间的角度公式是: 假设点一(X1,Y1),点二(X2,Y2) double angleOfLine = Math.Atan2((Y2 - Y1), (X2 - X2)) * 180 / Ma ...
随机推荐
- git 下载单个文件 已经添加多个远程服务器
175down vote It is possible to do (in the deployed repository) git fetch followed by git checkout or ...
- 当输入域失去焦点 (blur) 时改变其颜色
$("input").blur(function(){ $("input").css("background-color","#D ...
- liferay常用api总结
liferay之笑傲江湖学习笔记<一> 我们大家都知道,想要在一项技术上过硬,你需要付出汗水的,需要闭门修炼,每一个成功的人,都是那种耐得住寂寞的人,好了闲话少说.开始学习之旅 在life ...
- 如何实现parseFloat保留小数点后2位
Number.toPrecision(2);function toPrecision ( [precision : Number] ) : String参数 precision 可选项.有效位数.值必 ...
- C++中的访问权限
C++中类的成员的权限: private:只能由该类的成员函数,友元函数访问,不能被该类的对象访问. protected:除了private外还能被子类的函数访问,同样不能被该类的对象访问. publ ...
- 1初识QT
创建程序步骤: 打开Qt Creator 界面选择 New Project或者选择菜单栏 [文件]-[新建文件或项目]菜单项 弹出New Project对话框,选择Qt Widgets Applica ...
- 【转】eclipse反编译插件
原文地址:http://bbs.csdn.net/topics/390263414 离线安装包下载地址一:http://feeling.sourceforge.net/downloads/org.sf ...
- Java缓存学习之六:Spring单独使用EhCache
通过在Application Context中配置EhCacheManagerFactoryBean和EhCacheFactoryBean,我们就可以把对应的EhCache的CacheManage ...
- 如何合并两个Git仓库
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- ELK学习笔记之Logstash详解
0x00 Logstash概述 官方介绍:Logstash is an open source data collection engine with real-time pipelining cap ...