代数几何:点,线,抛物线,圆,球,弧度和角度
一, 笛卡尔坐标系
笛卡尔坐标系是数学中的坐标系,而计算机中则采用屏幕坐标系统.
而三维坐标系则没有一个工业标准,分别有 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/
- UIScrollView无法响应touches的解决方法
- WCF技术剖析之十七:消息(Message)详解(下篇)
- UITextView自动滚动的解决方案
- MVC解决Json DataGrid返回的日期格式是/Date(20130450000365)
- Easyui 让DataGrid适应浏览器宽度
- Easyui 让Window弹出居中与最大化后居中
- WCF技术剖析之十六:数据契约的等效性和版本控制
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(13)-系统日志和异常的处理③
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理②
- Enterprise Library Policy Injection Application Block 之二: PIAB设计和实现原理
- 育碧与研究所共同开发的AI,是什么样的?
- 大家都在关注AI,但这些事你可能并不知道!
- AI—未来医疗
- 微信小程序新功能上线 一键连Wi-Fi手机变门禁卡
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python 爬取留言板留言(二):多线程版+selenium模拟
- 嵌套滑动通用解决方案--NestedScrollingParent2
- Python 爬取留言板留言(一):单进程版+selenium模拟
- Glide-图片加载框架全解(一)- 基本用法
- Python全栈(六)项目前导之1.Redis介绍及数据类型介绍
- 网络请求框架OkHttp3全解系列(一):OkHttp的基本使用
- 网络请求框架OkHttp3全解系列 - (二)OkHttp的工作流程分析
- 这次,我把Android事件分发机制翻了个遍
- 网络请求框架OkHttp3全解系列 - (三)拦截器详解1:重试重定向、桥、缓存(重点)
- Python全栈(七)Flask框架之4.Flask模板继承与案例练习
- 你想要的系列:网络请求框架OkHttp3全解系列 - (四)拦截器详解2:连接、请求服务(重点)
- 不会玩阴阳师的我带你一键下载《阴阳师:百闻牌》所有卡牌并调用百度OCR识别文字信息
- 微信小程序生命周期学习笔记-页面篇
- Python 字典 使用技巧
- 微信小程序生命周期学习笔记-组件