js+畫曲線和圓 並限制圓的渲染範圍

来源:http://www.cnblogs.com/csbt/archive/2017/12/16/8047786.html
-Advertisement-
Play Games

公式: 1)y=ax^2+bx+c; 2) y=a(x-k)+h; 通過已知三點可確定a,b,c,h,k 2.通過圓心坐標(a,b)和半徑r可確定一個圓,和已知的x坐標: 公式: 1)r^2=(x-a)^2+(y-b)^2 3.圓是否相交,可通過求得圓心距G確定,圓心(x1,y1)和(x2,y2): ...


  1. 通過三個點的坐標可確定一條雙曲線。

  公式:

      1)y=ax^2+bx+c;

      2) y=a(x-k)+h;

      通過已知三點可確定a,b,c,h,k

  2.通過圓心坐標(a,b)和半徑r可確定一個圓,和已知的x坐標:

  公式:

      1)r^2=(x-a)^2+(y-b)^2

  3.圓是否相交,可通過求得圓心距G確定,圓心(x1,y1)和(x2,y2):

      1) G^2=(x1-x2)^2+(y1-y2)^2

  4.確定圓上的點的x坐標是否在曲線內點(x,y),1中求得的a,h,k;算出當前y值時的所在的曲線x值得範圍:

      1)  x1 =Math.sqrt((y -h) / a) + k, x2 =k - Math.sqrt((y - h) / a);

  以下為源碼:

    

  1 <html>
  2 <head>
  3 
  4 </head>
  5 <body>
  6     <!--<div id="main">
  7 
  8     </div>-->
  9     <script>
 10         var mainDoc = document.getElementById("main");
 11         function _drawPoint(x, y) {
 12             var pe = document.createElement("div");
 13             pe.style.position = "absolute";
 14             pe.style.left = x;
 15             pe.style.top = y;
 16             pe.style.position
 17             pe.style.backgroundColor = "red";
 18             pe.style.width = 1;
 19             pe.style.height = 1;
 20             document.body.appendChild(pe);
 21         }
 22         var Circle = function (options) {
 23             this.center_x = options.center_x;
 24             this.center_y = options.center_y;
 25             this.radius = options.radius;
 26         }
 27         Circle.prototype = {
 28             draw: function () {
 29                 var sx = this.center_x - this.radius;
 30                 var ex = this.center_x + this.radius;
 31                 for (var i = sx; i <= ex; i += 0.1) {
 32                     var pos = this._pointCoordinate(i);
 33                     _drawPoint(pos[0].x, pos[0].y);
 34                     _drawPoint(pos[1].x, pos[1].y);
 35                 }
 36             },
 37             _pointCoordinate: function (x) {
 38                 var y = Math.sqrt(this.radius * this.radius - (x - this.center_x) * (x - this.center_x)) + this.center_y;
 39                 return [{ x: x, y: y }, {
 40                     x: x, y: this.center_y - (y - this.center_y)
 41                 }];
 42             }
 43         };
 44 
 45         var Hyperbola = function (options) {
 46             this.center_x = options.center_x;
 47             this.center_y = options.center_y;
 48             this.height = options.height;
 49             this.width = options.width;
 50             this.CircleList = [];
 51             this.k = 0;
 52             this.h = 0;
 53             this.a = 0;
 54             this._init();
 55         }
 56         Hyperbola.prototype = {
 57             draw: function () {
 58                 var sx = this.center_x - this.width / 2;
 59                 var ex = this.center_x + this.width / 2;
 60                 for (var i = sx; i <= this.center_x ; i += 0.1) {
 61                     var pos = this._pointCoordinate(i);
 62                     _drawPoint(pos[0].x, pos[0].y);
 63                     _drawPoint(pos[1].x, pos[1].y);
 64                 }
 65             },
 66             _init: function () {
 67                 var x1 = this.center_x - this.width / 2, y1 = this.center_y - this.height;
 68                 var x2 = this.center_x, y2 = this.center_y;
 69                 var x3 = this.center_x + this.width / 2, y3 = this.center_y - this.height;
 70                 var b = ((y1 - y2) * (x2 * x2 - x3 * x3) - (y2 - y3) * (x1 * x1 - x2 * x2)) / ((x1 - x2) * (x2 * x2 - x3 * x3) - (x2 - x3) * (x1 * x1 - x2 * x2));
 71                 var a = this.a = (y1 - y2 - b * x1 + b * x2) / (x1 * x1 - x2 * x2);
 72                 var c = y3 - a * x3 * x3 - b * x3;
 73                 var k = this.k = -b / (2 * a), h = this.h = (4 * a * c - b * b) / (4 * a);
 74             },
 75             _pointCoordinate: function (x) {
 76                 var y = this.a * (x - this.k) * (x - this.k) + this.h;
 77                 return [{ x: x, y: y }, {
 78                     x: this.center_x + Math.abs(this.center_x - x), y: y
 79                 }];
 80             },
 81             _randomCircle: function () {
 82                 var count = 1000;
 83                 while (count > 0) {
 84                     var x = this.center_x - this.width / 2 + Math.random() * this.width;
 85                     var y = this.center_y - Math.random() * this.height;
 86                     var radius = 3;
 87                     if (this.CheckTheBoundary(x - radius, y) && this.CheckTheBoundary(x + radius, y)
 88                         && this.CheckTheBoundary(x, y - radius) && this.CheckTheBoundary(x, y + radius)
 89                         && this.CheckTheCircle(x, y, radius)
 90                         ) {
 91                         var c = new Circle({ center_x: x, center_y: y, radius: radius });
 92                         c.draw();
 93                         this.CircleList.push(c);
 94                         count--;
 95                     }
 96                 }
 97             }
 98         ,
 99             move: function () {
100                 var speed = 5;
101                 for (var i = 0; i < this.CircleList.length; i++) {
102                     var c = this.CircleList[i];
103                     var x = this.center_x - this.width / 2 + Math.random() * this.width;
104                     var y = this.center_y - Math.random() * this.height;
105                     var radius = c.radius;
106                     if (this.CheckTheBoundary(x - radius, y) && this.CheckTheBoundary(x + radius, y)
107                           && this.CheckTheBoundary(x, y - radius) && this.CheckTheBoundary(x, y + radius)
108                           && this.CheckTheCircle(x, y, radius)
109                           ) {
110                         c.center_y = y;
111                         c.center_x = x;
112                         console.log(c.center_y);
113                         c.draw();
114                     }
115                 }
116             },
117             CheckTheBoundary: function (x, y) {
118                 if (y < (this.center_y - this.height)) return false;
119                 if (x < 0 || y < 0) return false;
120                 if (y > this.center_y) return false;
121                 var x1 = Math.sqrt((y - this.h) / this.a) + this.k, x2 = this.k - Math.sqrt((y - this.h) / this.a);
122                 var maxx = Math.max(x1, x2);
123                 var minx = Math.min(x1, x2);
124                 //if (isNaN(maxx) || isNaN(minx)) return false;
125                 if (x < minx || x > maxx) {
126                     return false;
127                 }
128                 return true;
129             },
130             CheckTheCircle: function (x, y, r) {
131                 for (var i = 0; i < this.CircleList.length; i++) {
132                     var g = Math.sqrt((x - this.CircleList[i].center_x) * (x - this.CircleList[i].center_x)
133                         + (y - this.CircleList[i].center_y) * (y - this.CircleList[i].center_y))
134                     if (g < (r + this.CircleList[i].radius))
135                         return false;
136                 }
137                 return true;
138             }
139         };
140         var h = new Hyperbola({ center_x: 700, center_y: 600, width: 800, height: 400 });
141         h.draw();
142         h._randomCircle();
143         //setInterval(function () {
144         //    h.move();
145         //}, 1000);
146     </script>
147 </body>
148 </html>
View Code

 

效果:

  

    

        

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一個資料庫被映射到多個不同的文件,這些文件由底層的操作系統來維護。每個文件分成定長的存儲單元,稱為塊(bolck),塊是存儲分配和數據傳輸的基本單元。資料庫預設的塊在4-8k之間。通常沒有記錄比塊更大(圖片音頻等大文件先不考慮),此外還要求每條記錄保存在單個塊中。 一、定長記錄instructor表 ...
  • LivingMongo是一個mongodb資料庫的GUI操作系統,支持對數據欄位的修改、數據搜索、集合的分類、索引管理、空間統計、慢查詢等 demo地址 : http://living-mongo.kupposhadow.com使用介紹 : 開源MongoDB GUI - LivingMongogi ...
  • 引言 在 "大數據學習系列之一 Hadoop環境搭建(單機)" 成功的搭建了Hadoop的環境,在 "大數據學習系列之二 HBase環境搭建(單機)" 成功搭建了HBase的環境以及相關使用介紹。本文主要講解如何搭建Hadoop+Hive的環境。 一、環境準備 1,伺服器選擇 本地虛擬機 操作系統: ...
  • 在安卓系統中預設每次啟動一個Activity時,系統會創建一個實例,並按照先進後出的原則放入任務棧中,當我們按back鍵時,就會有一個activity從任務棧頂移除,重覆下去,直到任務棧為空,系統就會回收這個任務棧。但是這樣以來,系統多次啟動同一個Activity時就會重覆創建多個實例,這種做法顯然... ...
  • ListView,就如其名,是用來顯示列表的一種View,而RecycleView,是其的加強版,今天帶來的是這兩個幾乎具有相同的功能的對比使用 先從ListView說起吧 ListView: 1.在佈局文件中使用ListView,併為其定義一個id,方便我們之後的調用,寬高與父控制項相同 2.準備數 ...
  • [1]初識狀態模式 [2]通用結構 [3]文件上傳 [4]優缺點 [5]狀態機 ...
  • [1]概念 [2]javascript裝飾者 [3]裝飾函數 [4]AOP [5]AOP應用實例 [6]裝飾者模式和代理模式 ...
  • 前些日子辭掉了工作,比較輕鬆,有大把的時間寫博客神馬的,陸續面了幾個不錯的互聯網公司,有成功的也有失敗的,阿裡的面試及offer都來的很意外,還沒來得及投百度,由於阿裡給的條件及工作內容都讓我很滿意了,唯一的遺憾是得離開北京去杭州,不知道現在還要不要投投其他的也試試。 至於為什麼選在年前離職,其實這 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...