zoukankan      html  css  js  c++  java
  • js+画曲线和圆 并限制圆的渲染范围

    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,  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

    效果:

      

        

            

      

  • 相关阅读:
    android中的一个圆角图片
    android中一个评分的控件
    C++ primer(第五版)中需要复习第二遍的知识点记录
    在ubuntu18.04上交叉编译opencv2.4.9
    C6748和音频ADC连接时候的TDM以及I2S格式问题
    C6748的启动方式问题
    AK5703的ALC
    cool edit工具介绍及使用
    CCS编译环境及TI仿真器的使用
    把YUV转化成opencv中的Mat格式的两行代码备份
  • 原文地址:https://www.cnblogs.com/csbt/p/8047786.html
Copyright © 2011-2022 走看看