最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實(shí)現(xiàn)繪制貝塞爾曲線的函數(shù)

 更新時(shí)間:2022年12月14日 15:42:31   作者:編程小魚六六六  
貝塞爾曲線,又稱貝茲曲線或貝濟(jì)埃曲線,是應(yīng)用于二維圖形應(yīng)用程序的數(shù)學(xué)曲線。本文將利用C語言實(shí)現(xiàn)繪制貝塞爾曲線的函數(shù),需要的可以參考一下

程序截圖

簡(jiǎn)單說明

這個(gè)函數(shù)就是

void drawBezierCurve(COLORREF color, const unsigned int len, ...)

color 是貝塞爾曲線的顏色,len 是畫出貝塞爾曲線所需要的點(diǎn)的個(gè)數(shù),最少 1 個(gè),不要亂傳。之后的參數(shù)傳的就是畫出貝塞爾曲線要的點(diǎn),數(shù)據(jù)類型為 Vec2。

這個(gè)函數(shù)實(shí)現(xiàn)的基礎(chǔ)是參數(shù)方程,用參數(shù)方程將一條直線轉(zhuǎn)化為一個(gè)參數(shù)的方程,如:

A * x + B * y + C=0 可以轉(zhuǎn)化為 x = x0 - B * t;y = y0 + A * t,x0、y0 為直線上任意一個(gè)點(diǎn)的橫縱坐標(biāo)值,t 為未知參數(shù)。

對(duì)于一條線段,可以根據(jù)線段上兩個(gè)端點(diǎn)轉(zhuǎn)化為參數(shù)方程:

x = x0 + (x1 - x0) * t

y = y0 + (y1 - y0) * t

t ∈ [0, 1]

將這條線段分為 CURVEPIECE 份,t 從 0 到 1 一份一份地加,就能得到這條線段上均勻分布的 CURVEPIECE 個(gè)點(diǎn)。

貝塞爾曲線就是對(duì) n 個(gè)點(diǎn)連線組成的 n 條(線段上對(duì)應(yīng)份的點(diǎn))的連線的 (n - 1) 條(線段的對(duì)應(yīng)份點(diǎn))的連線的……直到最后 1 條線段上(對(duì)應(yīng)份點(diǎn)的連線)。

這個(gè)曲線的算法如果用遞歸的話可能會(huì)占用很大內(nèi)存,畢竟每一輪的點(diǎn)的值都保存下來了,我這里用循環(huán)做,空間占用只有兩輪內(nèi)點(diǎn)的值。

代碼實(shí)現(xiàn)

 
// 程序:畫貝塞爾曲線的函數(shù)
// 編譯環(huán)境:Visual Studio 2019,EasyX_20211109
//
 
 
#include <graphics.h>
#include <conio.h>
using namespace std;
 
// 畫貝塞爾曲線的函數(shù),包括這個(gè) Vec2 結(jié)構(gòu)體
struct Vec2
{
	double x, y;
};
void drawBezierCurve(COLORREF color, const unsigned int len, ...)
{
	if (len <= 0) return;
 
	va_list list;
	va_start(list, len);
	Vec2* temp = new Vec2[len];
	for (int i = 0; i < len; i++)
		temp[i] = va_arg(list, Vec2);
	va_end(list);
 
	if (len == 1)
	{
		putpixel(temp->x, temp->y, color);
		return;
	}
 
	Vec2* parent = nullptr, * child = nullptr;
	Vec2 lastPoint = temp[0];
	setlinecolor(color);
	for (double LineNum = 0; LineNum < 1 + 1.0 / 100; LineNum += 1.0 / 100)
	{
		int size = len;
		parent = temp;
		while (size > 1)
		{
			child = new Vec2[size - 1];
			for (int i = 0; i < size - 1; i++)
			{
				child[i].x = parent[i].x + (parent[i + 1].x - parent[i].x) * LineNum;
				child[i].y = parent[i].y + (parent[i + 1].y - parent[i].y) * LineNum;
			}
			if (parent != temp)delete[] parent;
			parent = child;
			size--;
		}
		line(lastPoint.x, lastPoint.y, parent->x, parent->y);
		lastPoint.x = parent->x;
		lastPoint.y = parent->y;
		delete[] parent;
		parent = nullptr;
		child = nullptr;
	}
	delete[] temp;
}
 
int main()
{
	initgraph(640, 480);
 
	Vec2 a = { 100, 80 };
	Vec2 b = { 540, 80 };
	Vec2 c = { 540, 400 };
	Vec2 d = { 100, 400 };
 
	setlinecolor(BLUE);
	line(a.x, a.y, b.x, b.y);
	line(b.x, b.y, c.x, c.y);
	line(c.x, c.y, d.x, d.y);
 
	drawBezierCurve(RED, 4, a, b, c, d);
 
	_getch();
	closegraph();
	return 0;
}

到此這篇關(guān)于C語言實(shí)現(xiàn)繪制貝塞爾曲線的函數(shù)的文章就介紹到這了,更多相關(guān)C語言繪制貝塞爾曲線內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何通過C++在Bing搜索引擎上進(jìn)行命令行搜索

    如何通過C++在Bing搜索引擎上進(jìn)行命令行搜索

    這篇文章主要介紹了通過C++在Bing搜索引擎上進(jìn)行命令行搜索,在這篇文章中,我們將介紹一個(gè)簡(jiǎn)單的C++程序,允許用戶通過命令行輸入搜索詞,在Bing搜索引擎上執(zhí)行搜索,并在默認(rèn)瀏覽器中顯示搜索結(jié)果,需要的朋友可以參考下
    2023-12-12
  • C語言中的自定義類型之結(jié)構(gòu)體與枚舉和聯(lián)合詳解

    C語言中的自定義類型之結(jié)構(gòu)體與枚舉和聯(lián)合詳解

    今天我們來學(xué)習(xí)一下自定義類型,自定義類型包括結(jié)構(gòu)體、枚舉、聯(lián)合體,小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考
    2022-06-06
  • C++使用easyx畫實(shí)時(shí)走動(dòng)的鐘表

    C++使用easyx畫實(shí)時(shí)走動(dòng)的鐘表

    這篇文章主要為大家詳細(xì)介紹了C++使用easyx畫實(shí)時(shí)走動(dòng)的鐘表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 詳解Qt如何加載libxl庫

    詳解Qt如何加載libxl庫

    這篇文章主要介紹了詳解Qt如何加載libxl庫,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C++變量,常量,數(shù)組和字符串詳解

    C++變量,常量,數(shù)組和字符串詳解

    這篇文章主要介紹了C++變量,常量,數(shù)組和字符串,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10
  • 簡(jiǎn)單的漢諾塔問題解法代碼

    簡(jiǎn)單的漢諾塔問題解法代碼

    漢諾塔本是C語言開門就學(xué)的東西,簡(jiǎn)單的漢諾塔問題解法代碼
    2013-03-03
  • C++多重繼承二義性原理實(shí)例解析

    C++多重繼承二義性原理實(shí)例解析

    這篇文章主要介紹了C++多重繼承二義性原理實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • C++線程安全的隊(duì)列你了解嘛

    C++線程安全的隊(duì)列你了解嘛

    這篇文章主要為大家詳細(xì)介紹了C++線程安全的隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++實(shí)現(xiàn)神經(jīng)BP神經(jīng)網(wǎng)絡(luò)

    C++實(shí)現(xiàn)神經(jīng)BP神經(jīng)網(wǎng)絡(luò)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)神經(jīng)BP神經(jīng)網(wǎng)絡(luò),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C語言實(shí)現(xiàn)在控制臺(tái)打印余弦曲線

    C語言實(shí)現(xiàn)在控制臺(tái)打印余弦曲線

    余弦曲線又叫余弦波(cosinwave),是一種來自數(shù)學(xué)三角函數(shù)中的余弦比例的曲線。這篇文章主要為大家介紹了如何在控制臺(tái)繪制余弦曲線,感興趣的可以了解一下
    2023-02-02

最新評(píng)論

嵊泗县| 杨浦区| 尚义县| 乌鲁木齐市| 竹山县| 建宁县| 包头市| 浦县| 长岛县| 平远县| 马公市| 玉溪市| 绥化市| 青田县| 吉安县| 景洪市| 台东县| 巴林左旗| 通海县| 若尔盖县| 类乌齐县| 丹东市| 建昌县| 呼和浩特市| 沂源县| 舒城县| 曲周县| 华池县| 察雅县| 桂东县| 明溪县| 开阳县| 二连浩特市| 汉川市| 宁河县| 华蓥市| 山西省| 彭水| 林芝县| 南皮县| 吴江市|