当前位置: 首页 > article >正文

C语言实现Cohen_Sutherland算法

前提简要:

算法简介:

        编码算法是最早、最流行的线段裁剪算法,该算法采用区域检验的方法,能够快速有效地判断一条线段与裁剪窗口的位置关系,对完全接受或完全舍弃的线段无需求交,即可直接识别。

算法思想:

         编码算法将整个画布分成9个区域,如下图所示:

    根据线段端点所在位置,给每个端点一个四位二进制码(称为区域码)。四位区域码的4位从左到右依次表示上、下、右、左。区域码的任何为赋值为1代表端点落在相应的区域中,否则为0。
————————————————
版权声明:本文为CSDN博主「矢月」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44397852/article/details/109015504

代码实现:

//利用数值的位运算
//实现Cohen_Sutherland算法
double xl, xr, yt, yb;//事先给出的窗口位置,四个数值均为已知
void Cohen_SutherLand(double x0, double y0, double x2, double y2)
{
	int c, c0, c1;
	double x, y;
	c0 = makecode(x0, y0); c1 = makecode(x2, y2);
	while (c0 != 0 || c1 != 0) {
		if (c0&c1 != 0)return;
		c = c0; if (c == 0)c = c1;
		if (c & 1 == 1) 
		{
			y = y0 + (y2 - y0)*(xl - x0) / (x2 - x0);
			x = xl;
		}
		else if (c & 2 == 2) {
			y = y0 + (y2 - y0)*(xr - x0) / (x2 - x0);
			x = xr;
		}
		else if (c & 4 == 4) {
			x = x0 + (x2 - x0)*(yb - y0) / (y2 - y0);
			y = yb;
		}
		else if (c & 8 == 8) {
			x = x0 + (x2 - x0)*(yt - y0) / (y2 - y0);
			y = yt;
		}
		if (c == c0) {
			x0 = x;
			y0 = y;
			c0 = makecode(x, y);
		}
		else {
			x2 = x;
			y2 = y;
			c1 = makecode(x, y);
		}
		showline(x0, y0, x2, y2);//显示可见线段
	}
}
int makecode(double x, double y) {
	int c = 0;
	if (x < xl)c = 1;
	else if (x > xr)c = 2;
	if (y < yb)c = c + 4;
	else if (y > yt)c = c + 8;
	return c;
}

http://www.kler.cn/news/155998.html

相关文章:

  • 构造函数的定义
  • Prometheus+Grafana搭建日志采集
  • Langchain-Chatchat的安装过程
  • C++基础 -35- string类
  • 操作系统·存储器管理
  • 亚信科技AntDB数据库完成中国信通院数据库迁移工具专项测试
  • unordered_map与unordered_set的实现(含迭代器)
  • go使用aes加密算法
  • 【ArcGIS Pro微课1000例】0043:深度学习--框架库安装
  • 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(3)路由导航卫士、主页实现
  • Jupyter NoteBook未授权访问漏洞
  • 2024年天津财经大学珠江学院专升本专业课报名缴费操作流程
  • KALI LINUX入门
  • LC-1423. 可获得的最大点数(子数组和、枚举)
  • 牛客在线编程(SQL大厂面试真题)
  • 抓取检测(Grasp Dection)
  • U盘不仅能在电脑上使用,在手机上也可使用,包括安卓和苹果手机,但苹果的较特殊
  • 二叉树k层的叶子结点个数
  • 【Qt开发流程】之自定义语法高亮和使用HTML语法
  • Proteus仿真--基于ADC0832设计的两路电压表
  • Mongodb安装及其使用
  • Linux 基本语句_14_信号灯实验
  • Hdoop学习笔记(HDP)-Part.06 安装OracleJDK
  • 【Java基础系列】BigDecimal入门
  • GB/T 37380-2019抗污易洁涂膜玻璃检测
  • Paxos 算法
  • 算法通关村第十六关-白银挑战滑动窗口经典题目
  • 第十七章 其他-rpc、rabbitmq(如何对消息做持久化、如何控制消息被消费的顺序)、celery(应用场景、运行机制、如何实现定时任务)
  • postgres在docker中使用
  • LeetCode刷题---反转链表