栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Liang-Barsky 裁剪算法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Liang-Barsky 裁剪算法

算法原理:
分别计算原直线与四条边框延长线的四个交点,在中间的两个交点即为裁剪完成的两个点。
p1-p2黑色直线为原直线;
红色矩形为裁剪边框;
绿色线为裁剪边框的延长线;
紫色为原直线的延长线;
ABCD分别为原直线与四条边框的延长线的交点;

以求B点为例:
B点横坐标已知,若求出BF的长度,则可以用p1坐标表示B点坐标;

BF可用黄色三角形和小三角形 相似三角形求解;
求出系数u,即可求出点坐标。

#include
#include
#include
#include
float startx = 0, starty = 0, endx = 0, endy = 0;
float xL = 100, xR = 400, yB = 400, yT = 100;
float u1, u2;
using namespace std;

void Breshham(int x0, int y0, int x1, int y1) {
	double dx = x1 - x0, dy = y1 - y0;
	//绘制垂线
	if (fabs(x0 - x1) < 1e-6) {
		if (y0 > y1) {
			swap(y0, y1);
			swap(x0, x1);
		}
		int x = round(x0), y = round(y0);
		for (y = round(y0); y < round(y1); y++) {
			glVertex2f(x, y);
		}
	}
	double k, d;
	k = dy / dx;
	if (k >= 0.0 && k <= 1.0) {
		if (x0 > x1) {
			swap(x0, x1);
			swap(y0, y1);
		}
		int x = round(x0), y = round(y0);
		d = 0.5 - k;
		for (x = round(x0); x < round(x1); x++) {
			glVertex2f(x, y);
			if (d < 0) {
				y++;
				d += 1 - k;
			}
			else {
				d -= k;
			}
		}

	}
	else if (k > 1) {

		if (y0 > y1) {
			swap(y0, y1);
			swap(x0, x1);
		}
		int x = round(x0), y = round(y0);
		d = 1 - 0.5*k;
		for (y = round(y0); y < round(y1); y++) {
			glVertex2f(x, y);
			if (d >= 0) {
				x++;
				d += 1 - k;
			}
			else {
				d += 1;
			}
		}

	}
	else if (k >= -1.0 && k <= 0.0) {

		if (x0 < x1) {
			swap(x0, x1);
			swap(y0, y1);
		}
		int x = round(x0), y = round(y0);
		k = -k;
		d = 0.5 - k;
		for (x = round(x0); x > round(x1); x--) {
			glVertex2f(x, y);
			if (d < 0) {
				y++;
				d += 1 + k;
			}
			else {
				d -= k;
			}
		}

	}
	else if (k < -1.0) {

		if (y0 > y1) {
			swap(x0, x1);
			swap(y0, y1);
		}
		int x = round(x0), y = round(y0);
		k = -k;
		d = 1 - 0.5*k;
		for (y = round(y0); y < round(y1); y++) {
			glVertex2f(x, y);
			if (d >= 0) {
				x--;
				d += 1 - k;
			}
			else {
				d += 1;
			}

		}
	}
}

void rectangle()
{
	glColor4f(1.0, 1.0, 0.0, 0.75);
	glBegin(GL_POLYGON);
	glVertex2f(xL, yB);
	glVertex2f(xR, yB);
	glVertex2f(xR, yT);
	glVertex2f(xL, yT);
	glEnd();
}


bool ClipT(float p, float q)
{
	float r;
	if (p < 0)
	{
		r = q / p;
		if (r > u2)
			return false;
		u1 = max(u1, r);
	}
	else if (p > 0)
	{
		r = q / p;
		if (r < u1)
			return false;
		u2 = min(u2, r);
	}
	else return (q >= 0);
	return true;
}


void L_B_lineClip(float x1, float y1, float x2, float y2)
{
	float dx = x2 - x1, dy = y2 - y1;
	u1 = 0, u2 = 1;
	if (ClipT(-dx, x1 - xL))
		if (ClipT(dx, xR - x1))
			if (ClipT(-dy, y1 - yT))
				if (ClipT(dy, yB - y1))
				{
					cout << u1 <<"  "<< u2<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/311670.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号