1. 程式人生 > >【裁剪】線段的裁剪——Liang-Barskey演算法以及程式碼實現

【裁剪】線段的裁剪——Liang-Barskey演算法以及程式碼實現

要理解這個演算法,要理解如下問題。

一、直線的引數方程

起點為P0(x0,y0),終點為P1(xend,yend)線段的引數方程:

這裡寫圖片描述

u=0->(x0,y0) u=1->(xend,yend)

直線上任何一個點都可以用一個引數來決定,任何一條線段都可以用兩個引數來決定

這裡寫圖片描述

二、入點、出點與端點

(1)線段和視窗平行-略

(2)線段和視窗不平行,則直線和視窗的延長線必有四個交點。

這裡寫圖片描述

①進邊和出邊的確定:

IF deltaX>0,直線從左邊界的外部進入內部,從做到右計算進1,出1。(裁剪視窗所在側定義為內部)

否則,從右向左計算進1,出1.

IF deltaY>0,直線從下邊界的外部進入內部,從下到上計算進2,出2。

否則,從上向下計算進2,出2。

如下圖,deltaX>0,deltaY>0:

這裡寫圖片描述

②保留部分:

這裡寫圖片描述

max(0,進1,進2)<=u<=min(1,出1,出2)

三、程式碼實現

void LB_LineClip(x1,y1,x2,y2,XL,XR,YB,YT)
float x1,x2,y1,y2,XL,XR,YB,YT;
{
   float dx,dy,u1,u2;
   tl=0;tu=1;
   dx = x2 -x1;
   dy = y2 -y1;
   if(ClipT(-dx,x1-XL,&u1,&u2)
     if(ClipT(dx,XR-x1,&u1,&u2)
       if
(ClipT(-dy,y1-YB,&u1,&u2) if(ClipT(dy,YT-y1,&u1,&u2) displayline(x1+u1*dx,y1+u1*dy,x1+u2*dx,y1+u2*dy); } bool ClipT(p,q,u1,u2) float p,q,*u1,*u2; { float r; if(p<0) { r=q/p; if(r>*u2) return FALSE; if(r>*u1) *u1=r; } else
if(p>0) { r=q/p; if(r<*u1) return FALSE; if(r<*u2) *u2=r; } else return(q>=0); return TRUE; }

相關推薦

裁剪線段裁剪——Liang-Barskey演算法以及程式碼實現

要理解這個演算法,要理解如下問題。 一、直線的引數方程 起點為P0(x0,y0),終點為P1(xend,yend)線段的引數方程: u=0->(x0,y0) u=1->(xend,yend) 直線上任何一個點都可以用一個引數來決

SpringBoot--Spring Boot核心(原理以及程式碼實現

github:https://github.com/Ccww-lx/SpringBoot.git   SpringBoot作為我們日常開發的框架,我們必須熟悉掌握SpringBoot基礎核心,包括SpringBoot執行原理、基礎配置、外部配置、日誌配置、Profile配置、核心註解等等,其中: Sprin

轉:總結推薦系統中常用演算法 以及優點缺點對比

轉:http://www.sohu.com/a/108145158_464065   在推薦系統簡介中,我們給出了推薦系統的一般框架。很明顯,推薦方法是整個推薦系統中最核心、最關鍵的部分,很大程度上決定了推薦系統性能的優劣。目前,主要的推薦方法包括:基於內容推薦、協同過濾

三種快速排序演算法以及快速排序的優化

一.  快速排序的基本思想 快速排序使用分治的思想,通過一趟排序將待排序列分割成兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小。之後分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。 二.  快速排序的三個步驟 1) 選擇基準:在待排序列中,按照某種方式挑出一個元素,作為 “基準”(p

NLPCNN文字分類原理及python程式碼實現

CNN分類模型架構   python程式碼實現: #!/usr/bin/python # -*- coding: utf-8 -*- import tensorflow as tf class TCNNConfig(object): #class TCNNConfig(

RESTREST、RESTFUL的理解以及SpringMVC實現Restful程式設計

網上有相關很多rest的文章,本人看著實在是晦澀,太抽象了,很難看懂。 其實HTTP 1.1協議的整體軟體架構就可以說是REST架構 瞭解REST得知道5個名字: 1、資源 Resource 資源就是伺服器上獲取到的東西都可以說是資源,一條使用者記錄,一個使用者的密碼,一張

Swift圖片裁剪

/// 截圖 /// /// - Parameters: /// - view: view /// - atFrame: rect func imageFromView(view : UIView,atFrame:CGRect) ->

P3372 模板線段樹 1

load color 求和 整數 數字 amp article http cst 題目描述 如題,已知一個數列,你需要進行下面兩種操作: 1.將某區間每一個數加上x 2.求出某區間每一個數的和 輸入輸出格式 輸入格式: 第一行包含兩個整數N、M,分別表示該數

[洛谷3373]模板線段樹 2

兩個 cstring tchar int() 維護 string max nbsp 線段 思路: 線段樹。同時維護兩個 lazy tag ,一個維護乘,一個維護加。根據加法結合律,可以得出:當同一個結點進行兩次加操作時,新的標記等於兩次標記之和。根據乘法結合律,可以得出:

P3373 模板線段樹 2 區間求和 區間乘 區間加

std 數列 cst printf int img ostream string uil 題目描述 如題,已知一個數列,你需要進行下面兩種操作: 1.將某區間每一個數加上x 2.將某區間每一個數乘上x 3.求出某區間每一個數的和 輸入輸出格式 輸入格

線段樹區間修改 P3372 模板線段樹 1

print alt namespace clu 格式 getch 輸出格式 包含 模板    題目描述 如題,已知一個數列,你需要進行下面兩種操作: 1.將某區間每一個數加上x 2.求出某區間每一個數的和 輸入輸出格式 輸入格式: 第一行包含兩個整數N、M,分別表示該數

原創洛谷 LUOGU P3373 模板線段樹2

取模 file 需要 code ace highlight dig org zh-cn P3373 【模板】線段樹 2 題目描述 如題,已知一個數列,你需要進行下面兩種操作: 1.將某區間每一個數加上x 2.將某區間每一個數乘上x 3.求出

codevs1082線段樹練習 3

adl for while small get color ace str 所有 題目描述 Description 給你N個數,有兩種操作: 1:給區間[a,b]的所有數增加X 2:詢問區間[a,b]的數的和。 輸入描述 Input Description 第一

洛谷P3372模板線段樹 1

return blog 限制 空格 ges 進行 esp -m node 題目描述 如題,已知一個數列,你需要進行下面兩種操作: 1.將某區間每一個數加上x 2.求出某區間每一個數的和 輸入輸出格式 輸入格式: 第一行包含兩個整數N、M,分別表示該數列數字的個數和操作的

luogu P3373 模板線段樹 2

strong put || www pri 模板 add clu pro 原題鏈接:https://www.luogu.org/problem/show?pid=3373 其實也沒啥好說的,就是註意一下乘法標記會影響到加法標記 #include<cstdio

線段洛谷 P3372 模板線段樹 1

tree dtree cnblogs oot ++ query urn true typedef 動態開結點線段樹板子。 #include<cstdio> using namespace std; typedef long long ll; ll s

luogu_3372 模板線段樹 1

ons pushd int tdi sha brush iostream pda namespace #include <cstdio> #include <iostream> using namespace std; const int N=10

luogu 3372模板線段樹1

-- 含義 return pri 一行 一個數 code update upload 題目描述 如題,已知一個數列,你需要進行下面兩種操作: 1.將某區間每一個數加上x 2.求出某區間每一個數的和 輸入輸出格式 輸入格式: 第一行包含兩個整數N、M,分別表示該數

codevs3012線段覆蓋4

pri 回來 dev bsp while return iostream space n) 這個題很好想到它的無後效性,但是我並不是很會寫轉移方程,看了別人的題解以後豁然開朗,序列dp多是以序列的第幾位作為狀態來進行轉移的 #include<algorithm&

洛谷P3373 模板線段樹 2

表示 區別 操作 () 運算 新的 一點 說明 con 題目描述 如題,已知一個數列,你需要進行下面兩種操作: 1.將某區間每一個數加上x 2.將某區間每一個數乘上x 3.求出某區間每一個數的和 輸入輸出格式 輸入格式: 第一行包含三個整數N、M、P,分別表示該數列數字