代数几何:点,线,抛物线,圆,球,弧度和角度

一, 笛卡尔坐标系                        

笛卡尔坐标系是数学中的坐标系,而计算机中则采用屏幕坐标系统.

而三维坐标系则没有一个工业标准,分别有 Y轴向上(y-up)的坐标系, Z轴向上(z-up)的坐标系, 右手坐标系(right-handed coordinate system), 左手坐标系(left-handed coordinate system).

下面的是y-up left-handed coordinate system

数学中通常以括号加住的方式,如P(x,y,z)来表示点, 而程序中通常使用p<x,y,z>或p[x,y,z]表示点.代码片段:

function Point2D(x, y){
  this.x = x
  this.y = y
}

function Point3D(x, y, z){
  this.x = x
  this.y = y
  this.z = z
}

二, 线                                              

  1. 求两点之间的距离

勾股定理: a2 + b2 = c2

2D场景中, 假设要获取P1(x1, y1)与P2(x2, y2)之间的距离d, 计算公式:

/*
 *@param {Point2D} p1
 *@param {Point2D} p2
 *@return {number}
 */
function distance2D(p1, p2){
  var dX = p1.x - p2.x
    , dY = p1.y - p2.y
  return Math.sqrt(Math.pow(dX, 2) + Math.pow(dY, 2))
}

3D场景中,假设要获取P1(x1, y1, z1)与P2(x2, y2, z2)之间的距离d, 计算公式:

/*
 *@param {Point3D} p1
 *@param {Point3D} p2
 *@return {number}
 */
function distance3D(p1, p2){
  var dX = p1.x - p2.x
    , dY = p1.y - p2.y
    , dZ = p1.z - p2.z
  return Math.sqrt(Math.pow(dX, 2) + Math.pow(dY, 2) + Math.pow(dZ, 2))
}

   2. 斜率

数学公式:, slope为正数则直线横穿第一和第三像限, 为负数则直线横穿第二和第四像限.

直线公式:  y = slope * x + b , b为直线与Y轴交点离原点的偏移量.

假设直线A为y1 = slope1 * x1 + b1, 而直线B为y2 = slope2 * x2 + b2

if (slope1 === slope2){
  console.log("A与B平行")

  if (b1 === b2)
     console.log("A与B重合")
}
else{
  console.log("A与B相交")

  if (-1 === slope1 * slope2)
    console.log("A与B相互垂直")
}

三, 抛物线                             

抛物线分为4个方向

假设抛物线定点P(x1,y1)

Y轴对称的抛物线: y = a(x - x1)2 + y1 , a为正数则开口向上, a为负数则开口向下.

X轴对称的抛物线: x = a(y - y1)2 + x1, a为正数则开口向右, a为负数则开口向左.

四, 圆                            

假设圆心坐标P(x1, y1), 半径为r.

公式: (x - x1)2 + (y - y1)2 = r2

/*
 * @constructor
 * @param {Point2D} point 圆心坐标
 * @param {number} r 半径
 */
function Circle(point, r){
  this.point = point
  this.r = r
}

碰撞算法基础: 两圆相切或相交

公式:

/*
 *@param {Circle} c1
 *@param {Circle} c2
 *@return {boolean}
 */
function isHit(c1, c2){
  var dCenter = Math.sqrt(Math.pow(c1.center.x - c2.center.x, 2) + Math.pow(c1.center.y - c2.center.y, 2))
  var totalRadius = c1.r + c2.r

  return dCenter <= totalRadius
}

五, 球(3D)                          

假设球心坐标P(x1,y1,z1), 半径为r

公式: (x - x1)2 + (y - y1)2 + (z - z1)2 = r2

/*
 *@param {Point3D} center
 *@param {number} r
 */
function Sphere(center, r){
  this.center = center
  this.radius = r
}

碰撞算法基础: 两球相切或相交

/*
 *@param {Sphere} c1
 *@param {Sphere} c2
 *@return {boolean}
 */
function isHit(c1, c2){
  var dCenter = Math.sqrt(Math.pow(c1.center.x - c2.center.x, 2) + Math.pow(c1.center.y - c2.center.y, 2) + Math.pow(c1.center.z - c2.center.z, 2))
  var totalRadius = c1.r + c2.r

  return dCenter <= totalRadius
}

六, 弧度和角度                        

以笛卡尔坐标系的P(0,0)作为角点. 初始边为X轴的正半轴, 终边与初始边构成一个夹角.

初始边逆时针旋转得到的夹角度数为正值, 顺时针旋转得到的夹角度数为负值.

π≈3.141592654

角度:degree=radian*180/π

弧度:radian=degree*π/180

function getDegree(radian){
  return radian * 180 / Math.PI
}

function getRadian(degree){
  return degree * Math.PI / 180
}

参考: http://www.cnblogs.com/HelloCG/

时间: 2024-08-10 08:05:05

代数几何:点,线,抛物线,圆,球,弧度和角度的相关文章

ArcGIS Engine 开发(二)线、圆、矩形、面、文本编辑功能

ArcGIS Engine 开发(二)线.圆.矩形.面.文本编辑功能,这些都是实现课上的源代码,自己调试好了,直接可以放到vs2010下跑,希望能对大家有所帮助 好了,先来看效果 二.下面是调试好的代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using Syste

openlayers绘制点,线,圆等

由于我的业务需求是可以在底图上进行一些操作,比如绘制电子围栏等功能,于是需要使用openlayers中的画笔功能,接下来开始一波操作 还是上一篇的html页面, 直接上代码 <!doctype html> <html lang="en"> <head> <script src="./js/ol.js"></script> <link rel="stylesheet" href=&q

弧度和角度的转换

这两天在看同事写的四叉树代码,当中用到了孤度和角度之间的转换,所以转载此文章进行了学习 2009-12-01 弧度与角度的关系 一.角的两种单位 " 弧度"和"度"是度量角大小的两种不同的单位.就像"米"和"市尺"是度量长度大小的两种不同的单位一样.    在flash里规定:在旋转角度(rotation)里的角,以"度"为单位:而在三角函数里的角要以"弧度"为单位.这个规定是我们首先要

JS中弧度和角度的转换

网上看了很多教程,都写的太复杂了,其实弧度和角度转换很容易 弧度= 角度 * Math.PI / 180; 角度 = 弧度 * 180 / Math.PI; 就这么简单,直接看计算器, sin30度 是0.5,那么程序中的值是多少呢?  console.log( Math.sin( 30*Math.PI/180 ) ); 值稍微有偏差,不过没关系,JS本身就不擅长算数. 最后复习一下正弦,余弦,正切,余切. 正弦:对面比斜边 余弦:临边比斜边 正切:对边比临边 余切:临边比对边 另外还有个正割和

CGAffineTransform 获取 旋转的弧度 和 角度 的方法

        CGAffineTransform _trans = sticker.transform;         CGFloat rotate = acosf(_trans.a);       // 旋转180度后,需要处理弧度的变化         if (_trans.b < 0) {             rotate = M_PI -rotate;                 } // 将弧度转换为角度      CGFloat degree = rotate/M_PI 

常用宏定义 - 由角度转换弧度、由弧度转换角度

1.角度转换弧度 #define CHDegreesToRadian(x) (M_PI * (x) / 180.0) 2.弧度转换角度 #define CHRadianToDegrees(radian) (radian*180.0)/(M_PI) 原文地址:https://www.cnblogs.com/CH520/p/9311409.html

Quartz2d (画线 矩形 圆 三角形 弧线 扇形 进度圈等)

</pre><pre code_snippet_id="1675698" snippet_file_name="blog_20160509_1_1489477" name="code" class="objc">/** Quartz2d的图形绘制API */ "[画线drawLine]" 1.获取上下文件UIGraphicsGetCurrentContext(); 2.设置起点CGC

第十二周项目4-3:点,圆的关系-输出线和圆的交点

问题及代码: /* *Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:project.cpp *作 者:陈文青 *完成日期:2015年5月31日 *版 本 号:v1.0 * *问题描述: (6)与圆心相连的直线:给定一点p,其与圆心相连成的直线,会和圆有两个交点,如图.在上面定义的Point(点)类和Circle(圆)类基础上, 设计一种方案,输出这两点的坐标. *程序输入: *程序输出: */ #include <ios

扫描转换算法——DDA、中点画线画圆、椭圆

我的理解:在光栅图形学中,由于每一个点的表示都只能是整数值,所以光栅图形学实际只是对对实际图形的近似表示. 数值微分法(DDA):以下PPT截图来自北京化工大学李辉老师 代码实现: import matplotlib.pyplot as plt import matplotlib.patches as patches from pylab import * def init(ax): #将主标签设置为1的倍数 majorLocator = MultipleLocator(1); #设置主刻度标签