Chaikin Curve(球面插值)

?在兩條折線間完成平滑的過渡是 用畫布做UI 或者做類似地圖編輯器一類的工作的 很常見的任務。

怎么樣化方為圓是決定工作效率的很重要的因素。(當需要編輯的曲線多起來, 復雜起來的時候,這會是件相當繁重的工作)

最容易想到的莫非是 貝塞爾曲線,而且時下幾乎所有主流的數學算法庫或者畫布api 都已經很好的支持了貝塞爾曲線的繪制。 并能提供很便利的接口,通常只需知道 開始位置, 結束位置 ,以及貝塞爾控制點 就可生成一條貝塞爾曲線。

例如:

context.bezierCurveTo(controlX1, controlY1, controlX2, controlY2, endX, endY); 

貝塞爾曲線的定義是由當前的上下文來看,兩個控制點,和結束點。曲線的第一部分是切向的假想線,是由上下文點和第一個控制點定義。第二部分的曲線相切的假想線,是第二個控制點和結束點定義。

但是貝塞爾曲線仍舊屬于“高輸入”api, 尤其是貝塞爾控制點的定義,其實并不是一個簡單就能得到的東西。
而且在實際應用中,通常的需求多為 已知折線,然后把折線轉化為曲線的情況。

一般來說,折線我們是最好獲得的,得到轉折點連接起來就可以了。
但是當折線多起來的時候,會發現按照貝塞爾曲線繪制的思路來繪制平滑的曲線會是一件相當困難的事,光是控制點的確定就是一個大工程。

為了更好的,直接的把折線轉化為平滑的曲線。我們還是得回到曲線繪制的根源--- 折線模擬

這就是今天想記錄的Chaikin Curve, 插值曲線。

原理:
我們稱一條折線的起始和結束的點 為斷點, 中間的轉折點都叫折點。
于是, 在每個非端點的折點附近取連接這個折點的兩條線段各自的1/3位置處新建一個點。并將這兩個新建的點連接。
如此重復下去,直到模擬出想要的平滑度。

根據想要的不同的曲線弧度,也可將1/3 替換成 1/4 或1/2 ...

這種方法如此簡單,已知一條折線,根據需要定義迭代次數即可得到一條曲線(模擬)。

同時,用這種方式創建的折線還有一個優勢,就是很方便的能得到曲線的長度,因為是折線模擬的,所以折線長度之和即為曲線的長度。

也不用擔心這種類似二分的迭代方式計算量會有多大。我自己的測試,在800*800的區域通過插值來模擬曲線,基本也就迭代4次就已經足夠平滑了。

曲線模擬的過程大致如下的動畫:

以上都為隨機6個點,迭代模擬4次的過程。

主函數即為下面的 subDivide

    var Point2 = La.geometry.Point2, // Point Class
Vector2 = La.geometry.Vector2, // Vector Class
self = this;

this.subDivide = function (handles, subdivs) {
if (handles.length) {
do {
var numHandles = handles.length;
// 第一個點
handles.push(new Point2(handles[0].x, handles[0].y));

for (var i = 0; i < numHandles - 1; ++i) {
// 每次拿出兩個點
var p0 = handles[i];
var p1 = handles[i + 1];

// 根據兩個原始點創建兩個新點,做插值
var Q = new Point2(0.75 * p0.x + 0.25 * p1.x, 0.75 * p0.y + 0.25 * p1.y);
var R = new Point2(0.25 * p0.x + 0.75 * p1.x, 0.25 * p0.y + 0.75 * p1.y);

handles.push(Q);
handles.push(R);
}
// 最后一個店
handles.push(new Point2(handles[numHandles - 1].x, handles[numHandles - 1].y));

// 更新數組
for (var i = 0; i < numHandles; ++i)
handles.shift();
//handles.shift(numHandles);
} while (--subdivs > 0);
}
};



轉載于:https://www.cnblogs.com/hongru/archive/2011/10/27/2226946.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378036.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378036.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378036.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【2020 電設G題 圖像題解】

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 2022.3.10新增訂閱通知 近期把此專欄設置為了付費模式,可以直接花9.9買這個專欄,買了就可以直接這個專欄的所有文章了。后…

六、ROI和泛洪填充

一、ROI ROI&#xff1a;region of interest&#xff0c;即感興趣區域。 一般主要通過numpy來獲取ROI 將某區域轉變為灰色圖片再覆蓋原圖像 import cv2 import numpy as npsrc cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg") cv2.imshow(&quo…

VS2005 there is no source code available for the current location 解決方案

1.首先試最常規的方法&#xff1a;Clean and then rebuild solution&#xff0c;但是沒有解決 2.進入Tools>Options,選擇Debugging>General 卻掉 Enable address-level debugging 選項&#xff0c;在去掉 Require source files to exactly match the original version. O…

django 靜態數據_如何在Django中使用靜態數據?

django 靜態數據Static Data means those data items that we cannot want to change, we want to use them as it is like audio, video, images, files etc. 靜態數據是指我們不想更改的數據項&#xff0c;我們想像音頻&#xff0c;視頻&#xff0c;圖像&#xff0c;文件等那…

Leetcode226. 翻轉二叉樹(遞歸、迭代、層序三種解法)

目錄題目1、層序法&#xff1a;2、遞歸法&#xff1a;1、先序遍歷&#xff08;中左右&#xff09;2、后序遍歷&#xff08;左右中&#xff09;3、遞歸中序遍歷為什么不行&#xff08;左中右&#xff09;3、迭代法&#xff1a;1、先序遍歷2、中序遍歷3、后序遍歷為什么迭代法的中…

Asp.net 獲取當前目錄的三種方法

方法一&#xff1a; string sPath System.IO.Path.GetDirectoryName(Page.Request.PhysicalPath) 方法二&#xff1a; string sPath System.Web.HttpContext.Current.Request.MapPath("/") 方法三&#xff1a; string s…

一款jQuery立體感動態下拉導航菜單特效

一款jQuery立體感動態下拉導航菜單特效,鼠標經過&#xff0c;在菜單欄上方下拉出一個背景圖片&#xff0c;效果十分不錯的一款jquery特效。 對IE6都是兼容的&#xff0c;希望大家好好研究研究。 適用瀏覽器&#xff1a;IE6、IE7、IE8、360、FireFox、Chrome、Safari、Opera、傲…

七、模糊操作

一、模糊操作基本原理 1&#xff0c;基于離散卷積 2&#xff0c;定義好每一個卷積核 3&#xff0c;不同卷積核得到不同的卷積效果 4&#xff0c;模糊是卷積的一種表象 二、1*3卷積核舉例 每次右移一格&#xff0c;進行對應相乘再求和。1*3的卷積核左右兩邊的元素并沒有處理而…

LeetCode 100. 相同的樹 思考分析

給定兩個二叉樹&#xff0c;編寫一個函數來檢驗它們是否相同。 如果兩個樹在結構上相同&#xff0c;并且節點具有相同的值&#xff0c;則認為它們是相同的。 示例 1: 輸入: 1 1 / \ / 2 3 2 3 [1,2,3], [1,2,3]輸出: true 示例 2: 輸入: 1 1 / 2 2 [1,2], [1,null,2]輸…

在Python中以二進制格式輸入數字

Syntax to convert binary value to an integer (decimal format), 將二進制值轉換為整數(十進制格式)的語法&#xff0c; int(bin_value, 2)Here, 這里&#xff0c; bin_value should contain the valid binary value bin_value應該包含有效的二進制值 2 is the base value …

八、邊緣保留濾波(EPF)

一、概念 邊緣保留濾波(EPF,edge preserving filtering) 二、高斯雙邊 cv2.bilateralFilter(image,0,100,15)100為差異&#xff0c;15為周圍的區域 import cv2 import numpy as npdef bilateralFilter(image):dst cv2.bilateralFilter(image,0,100,15)cv2.imshow(bilater…

LintCode 375. 克隆二叉樹(深復制)

先序遍歷構造二叉樹 TreeNode * preorder(TreeNode * root){if(rootNULL) return NULL;TreeNode * ans;ansnew TreeNode(root->val);if(root->left!NULL){ans->leftpreorder(root->left);}if(root->right!NULL){ans->rightpreorder(root->right);}return…

關于ECMAScript基礎入門的分享

目錄 ECMAScript基礎入門1. 介紹2. 變量與數據類型2.1 變量2.2 數據類型 3. 運算符3.1 算術運算符3.2 比較運算符 4. 控制流4.1 條件語句4.2 循環語句 5. 函數6. 對象與數組6.1 對象6.2 數組 7. 總結 ECMAScript基礎入門 1. 介紹 ECMAScript是JavaScript的標準規范&#xff0…

kotlin 計算平方_Kotlin程序來計算復利

kotlin 計算平方Compound interest is the sum of principal amount and interest of interest. 復利是本金和利息之和。 Given, principal, rate, and time, we have to calculate the Compound interest. 給定本金&#xff0c;利率和時間&#xff0c;我們必須計算復利。 Fo…

近代科學為什么誕生在西方-1

寬泛的講&#xff0c;近代科學是幾種文明在長達幾個世紀的持續交流碰撞中產生的。它正在日益成為全世界全人類都有效的普適科學。通向現代科學之路就是通向自由和開放交流之路。 馬克思韋伯和莫頓都認為&#xff0c;科學事業要持續的進步就要特定的文化和制度的支持。 中國的數…

九、圖像直方圖

一、圖像直方圖的屬性 說白了就是將圖像上的各個顏色通道上的像素點的像素值進行統計&#xff0c;例如&#xff1a;像素值為14的像素點個數有幾個&#xff0c;進行顯示。 圖像的像素值取值范圍為[0,255]&#xff0c;這個范圍也成為直方圖的range也就是直方圖的橫坐標軸 每一個…

BIFR的完整形式是什么?

BIFR&#xff1a;工業和金融重組委員會 (BIFR: Board of Industrial and Financial Reconstruction) BIFR is an abbreviation of the Board of Industrial and Financial Reconstruction. It was an organization of the Government of India and a branch of the Department …

LeetCode 101. 對稱二叉樹 思考分析

題目 給定一個二叉樹&#xff0c;檢查它是否是鏡像對稱的。 例如&#xff0c;二叉樹 [1,2,2,3,4,4,3] 是對稱的。 1/ 2 2 / \ / 3 4 4 3 但是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的: 1/ 2 2 \ 3 3 進階&#xff1a; 你可以運用遞歸和迭代兩種方法解決這個…

內心能不能寧靜一點,做事能不能堅持一下

內心能不能寧靜一點&#xff0c;做事能不能堅持一下 每次朋友問我怎么樣&#xff0c;我總感覺不好回答&#xff0c;如果說實話我想他們或許是不能理解我的處境的&#xff0c;只能報以“還好”之類的語言&#xff0c;糊弄一下。唯一一次說了實話是&#xff1a;我墜落了&#xff…

直方圖反向投影

通過直方圖反向投影&#xff0c;根據目標衣服顏色的特征來進行定位 cv2.calcHist([roi_hsv],[0,1],None,[32,48],[0,180,0,256])其中[32,48]表示bin的個數&#xff0c;可以修改&#xff0c;當然范圍越小越精確 import cv2 import numpy as np from matplotlib import pyplot …