Canvas指定三角形內部生成隨機點

使用重心坐標(barycentric coordinates)或者通過面積比例的方法來確定點是否在三角形內。不過,對于簡單的應用,一種常見的方法是使用隨機點并檢查它們是否在三角形內部。如果不在,就重新生成,直到得到足夠數量的在三角形內的點。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Random Points in Triangle</title>
</head>
<body><canvas id="myCanvas" width="500" height="500" style="border:1px solid #000000;"></canvas><script>// 獲取Canvas元素和繪圖上下文var canvas = document.getElementById('myCanvas');var ctx = canvas.getContext('2d');// 定義三角形的三個頂點var vertex1 = { x: 50, y: 400 };var vertex2 = { x: 450, y: 50 };var vertex3 = { x: 50, y: 50 };// 檢查點是否在三角形內部(使用面積法)function isPointInTriangle(px, py, v1, v2, v3) {var b1 = (py - v3.y) * (v2.x - v3.x) - (px - v3.x) * (v2.y - v3.y);var b2 = (py - v1.y) * (v3.x - v1.x) - (px - v1.x) * (v3.y - v1.y);var b3 = (py - v2.y) * (v1.x - v2.x) - (px - v2.x) * (v1.y - v2.y);return (b1 > 0 || b2 > 0 || b3 > 0) && (b1 < 0 || b2 < 0 || b3 < 0);}// 生成三角形內部的隨機點function getRandomPointInTriangle(v1, v2, v3) {var r1, r2, s, t;// 生成兩個0到1之間的隨機數do {r1 = Math.random();r2 = Math.random();// 計算重心坐標s = r1;t = 1 - r1 - r2 * Math.sqrt(r1); // 確保t在0到1之間// 如果s+t+r2>1,則點在三角形外部,重新生成} while (s + t > 1);// 根據重心坐標計算點的位置var px = v1.x + s * (v2.x - v1.x) + t * (v3.x - v1.x);var py = v1.y + s * (v2.y - v1.y) + t * (v3.y - v1.y);return { x: px, y: py };}// 繪制三角形function drawTriangle(v1, v2, v3) {ctx.beginPath();ctx.moveTo(v1.x, v1.y);ctx.lineTo(v2.x, v2.y);ctx.lineTo(v3.x, v3.y);ctx.closePath();ctx.strokeStyle = 'black';ctx.lineWidth = 1;ctx.stroke();}// 繪制指定數量的隨機點function drawRandomPointsInTriangle(numPoints, v1, v2, v3) {ctx.fillStyle = 'red'; // 設置點的顏色for (var i = 0; i < numPoints; i++) {var point = getRandomPointInTriangle(v1, v2, v3);// 確保點在三角形內部(理論上getRandomPointInTriangle已經保證了這一點,但這里可以作為一個額外的檢查)if (isPointInTriangle(point.x, point.y, v1, v2, v3)) {ctx.beginPath();ctx.arc(point.x, point.y, 2, 0, Math.PI * 2, true); // 繪制一個小圓作為點ctx.fill();} else {// 如果出于某種原因點不在三角形內(理論上不應該發生),則重新生成該點i--; // 減少計數器,因為這次循環沒有成功生成一個有效點}}}// 調用函數繪制三角形和隨機點drawTriangle(vertex1, vertex2, vertex3); // 先繪制三角形drawRandomPointsInTriangle(10, vertex1, vertex2, vertex3); // 再繪制隨機點</script>
</body>
</html>

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

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

相關文章

智駕感知「大破局」!新一輪混戰開啟

隨著智能駕駛搭載率的攀升&#xff0c;艙外傳感器賽道迎來新變局。 一方面&#xff0c;從近幾年智駕傳感器的配置變化來看&#xff0c;攝像頭的主導地位顯而易見。 12月10-12日&#xff0c;由德賽西威總冠名的2024&#xff08;第八屆&#xff09;高工智能汽車年會暨年度金球獎…

深入解析Android Recovery系統

深入解析Android Recovery系統 引言 在Android系統中,Recovery模式是一個非常重要的組成部分。它主要用于系統的恢復、更新和修復。當用戶遇到系統問題時,Recovery模式可以提供一種安全的方式來恢復系統到正常狀態。本文將深入探討Android Recovery系統的實現原理,重點分析…

Kibana8.17.0在mac上的安裝

1、Kibana是什么 Kibana是與elasticsearch配套使用的數據分析與可視化工具&#xff0c;通過Kibana可以輕松與es中存儲的數據進行高效的交互&#xff0c;包括數據寫入、檢索、刪除等操作&#xff0c;并可以通過編寫部分代碼將數據做成各種報表&#xff0c;從而進行非常直觀的統…

數字IC后端設計實現十大精華主題分享

今天小編給大家分享下吾愛IC社區星球上周十大后端精華主題。 Q1:星主&#xff0c;請教個問題&#xff0c;長tree的時候發現這個scan的tree 的skew差不多400p&#xff0c;我高亮了整個tree的schematic&#xff0c;我在想是不是我在這一系列mux前邊打斷&#xff0c;設置ignore p…

給bmp和png,設置BLENDFUNCTION的AlphaFormat不同參數的效果

BLENDFUNCTION是AlphaBlend用控制透明效果的重要參數。 選擇一個32位的png圖片&#xff0c;設置AlphaFormat 為 AC_SRC_ALPHA&#xff0c;效果如上圖。 選擇一個32位的png圖片&#xff0c;設置AlphaFormat 為 0&#xff0c;效果如上圖。 選擇一個24位的bmp圖片&#xff0c;設置…

ChildLife“童年時光杯”足球聯賽啟動 共促青少年健康成長

2024年12月21日至22日&#xff0c;由美國知名嬰幼兒營養品牌ChildLife童年時光贊助的“童年時光杯”青少年足球聯賽將在上海拉開帷幕。本次賽事U7/U8組別共有16支足球隊參賽&#xff0c;包括上海幸運星足球俱樂部旗下的明星球隊&#xff0c;以及其他青少年俱樂部的優秀隊伍&…

面向對象的基本原則【學習、記錄】

1、單一職責原則定義 一個對象應該只包含單一的職責&#xff0c;并且該職責被完整地封裝在一個類中。就一個類而言&#xff0c;應該僅有一個引起它變化的原因。 2、開閉原則定義 一個軟件實體應當對擴展開放&#xff0c;對修改關閉。 3、里氏代換原則定義 如果對每一個類型為S的…

什么是根服務器?有什么作用?

你知道什么是根服務器嗎?在互聯網的龐大架構中&#xff0c;根服務器很多人對它的了解并不深入。那么&#xff0c;根服務器到底是什么&#xff0c;它有什么作用呢? 什么是根服務器? 根服務器是互聯網域名系統(DNS)的一部分&#xff0c;負責管理和維護最頂層的域名信息。簡單…

MTK--mt7921 usb wifi debug

文章目錄 1、代碼編譯2、配置文件修改3、Wifi設置命令4、Wifi debug 淘寶隨便買個7921的usb wifi。 1、代碼編譯 export TEMPLATECONF${PWD}/meta/meta-mediatek-mt8518/conf/base/aud8518sp2-slc-32b-7921-c4a-user source meta/poky/oe-init-build-env bitbake mtk-image-au…

日志層次結構及logger.propagate的作用

一、Python logging 模塊的層次結構 Python 的 logging 模塊提供了一個靈活的日志系統&#xff0c;適用于各種規模的應用程序。其核心設計基于層次化的命名系統&#xff0c;使得日志記錄可以按照組織結構進行管理和配置。 1. Logger&#xff08;日志器&#xff09; 定義&…

如何配置OSB連接數據連接/讀取超時

1.Oracle DB OSB中的DBAdapter的查詢超時參數配置沒用&#xff0c;要解決接口超時問題&#xff0c;需要在console中的數據源配置超時參數&#xff1a; oracle.net.CONNECT_TIMEOUT30000 oracle.net.READ_TIMEOUT30000 添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選…

一起學Git【第六節:查看版本差異】

git diff是 Git 版本控制系統中用于展示差異的強大工具。他可以用于查看文件在工作區、暫存區和版本庫之間的差異、任意兩個指定版本之間的差異和兩個分支之間的差異等,接下來進行詳細的介紹。 1.顯示工作區與暫存區之間的差異 # 顯示工作區和暫存區之間的差異,后面不加參數…

Python數據處理——re庫與pydantic的使用總結與實戰,處理采集到的思科ASA防火墻設備信息

目錄 Python正則表達式re庫的基本用法 引入re庫 各函數功能 總結 使用方法舉例 正則表達式語法與書寫方式 正則表達式的常用操作符 思科ASA防火墻數據 數據1 數據2 書寫正則表達式 Python中pydantic的使用 導入基礎數據模板 根據數據采集目標定義Pydantic數據類型…

Yolo11改進策略:Head改進|DynamicHead,利用注意力機制統一目標檢測頭部|即插即用

摘要 論文介紹 本文介紹了一種名為DynamicHead的模塊,該模塊旨在通過注意力機制統一目標檢測頭部,以提升目標檢測的性能。論文詳細闡述了DynamicHead的工作原理,并通過實驗證明了其在COCO基準測試上的有效性和效率。 創新點 DynamicHead模塊的創新之處在于它首次嘗試在一…

`we_chat_union_id IS NOT NULL` 和 `we_chat_union_id != ‘‘` 這兩個條件之間的區別

文章目錄 1、什么是空字符串&#xff1f;2、兩個引號之間加上空格 好的&#xff0c;我們來詳細解釋一下 we_chat_union_id IS NOT NULL 和 we_chat_union_id ! 這兩個條件之間的區別&#xff0c;以及它們在 SQL 查詢中的作用&#xff1a; 1. we_chat_union_id IS NOT NULL 含…

如何利用AWS監聽存儲桶并上傳到tg bot

業務描述&#xff1a; 需要監聽aws的存儲中的最新消息&#xff0c;發送新的消息推送到指定tg的頻道。 主要流程&#xff1a; 1.上傳消息到s3存儲桶&#xff08;不做具體描述&#xff09; 2.通過aws的lambda監聽s3存儲桶的最新消息&#xff08;txt文件&#xff09; 3.將txt文件…

HarmonyOS NEXT 實戰之元服務:靜態案例效果---查看國內航班服務

背景&#xff1a; 前幾篇學習了元服務&#xff0c;后面幾期就讓我們開發簡單的元服務吧&#xff0c;里面豐富的內容大家自己加&#xff0c;本期案例 僅供參考 先上本期效果圖 &#xff0c;里面圖片自行替換 效果圖1完整代碼案例如下&#xff1a; Index代碼 import { authen…

Windows11家庭版啟動Hyper-V

Hyper-V 是微軟的硬件虛擬化產品&#xff0c;允許在 Windows 上以虛擬機形式運行多個操作系統。每個虛擬機都在虛擬硬件上運行&#xff0c;可以創建虛擬硬盤驅動器、虛擬交換機等虛擬設備。使用虛擬化可以運行需要較舊版本的 Windows 或非 Windows 操作系統的軟件&#xff0c;以…

為什么深度學習和神經網絡要使用 GPU?

為什么深度學習和神經網絡要使用 GPU&#xff1f; 本篇文章的目標是幫助初學者了解 CUDA 是什么&#xff0c;以及它如何與 PyTorch 配合使用&#xff0c;更重要的是&#xff0c;我們為何在神經網絡編程中使用 GPU。 圖形處理單元 (GPU) 要了解 CUDA&#xff0c;我們需要對圖…

每天五分鐘機器學習:核函數

本文重點 在學習支持向量機算法之前,我們要繼續學習一些數學基礎,本文我們將學習核函數的概念。當數據線性不可分的時候,此時就需要核函數出場了,它可以將低維不可分的數據映射到高維可分數據,此時就可以完成數據分類了。 核函數的定義 核函數K(x, y)定義為兩個數據點x…