declare class GenMath {
    /**
     * 调整box大小
     * 
     * @param box map结构如: {xmin: 0, xmax: 1, ymin: 0, ymax: 1}
     * @param size 要调整的大小如: 1
     * @returns 调整大小后的box
     */
    resizeBox(box:JSON, size: Number):JSON

    /**
     * 偏移点坐标
     * 
     * @param point 点的坐标如: {x: 1, y:1}
     * @param shiftx x偏移，如 1
     * @param shifty y偏移，如 2
     * @param attr 其他属性，JSON类型，如 {mirror: false}
     * @returns 偏移后的点
     */
    gpShift(point:JSON, shiftx:Number, shifty:Number, attr:JSON):JSON

    /**
     * 变换点列表
     * 
     * @param base 基准点坐标
     * @param angle 选择角度，可选角度为 0, 90, 180, 270
     * @param mirror 是否镜像 true/false
     * @param shiftx x偏移 1
     * @param shifty y偏移 0
     * @param point 进行平移操作的点列表 [{x: .0, y: .0}, {x: 1.0, y: 2.0}]
     * @returns 变换后的点列表
     */
    pTrans(base:JSON, angle:Number, mirror:Boolean, shiftx:Number, shifty:Number, points:[JSON]):[JSON]

    /**
     * 旋转box
     * 
     * @param box 如 {xmin: 0, ymin: 0, xmax: 1, ymax: 1}
     * @angle 选择角度 0， 90， 180， 270
     * @returns 旋转后的box
     */
    rotateBox(box:JSON, angle:Number):JSON

    /**
     * 点到点的最小距离
     * @param p1 第一个点如 {x: .0, y: .0}
     * @param p2 第二个点如 {x: 1, y: .0}
     * @returns 距离
     */
    point2PointDis(p1:JSON, p2:JSON):Number

    /**
     * 线段长度，等同于点到点的最小距离
     * 
     * @param line 输入线段如: {xs: .0, ys: .0, xe: 1.0, ye: .0}
     * @returns 距离
     */
    lineLength(line:JSON):Number

    /**
     * 点到线段的最短距离
     * 
     * @param p 输入点
     * @param line 输入线段
     * @returns 距离
     */
    point2LineDis(p:JSON, line:JSON):Number

    /**
     * 线段是否相交
     * 
     * @param line1 第一条线段如 {xs: -1, ys: 0, xe: 2, ye: 0}
     * @param line2 第二条线段如 {xs: 0, ys: -1, xe: 0, ye: 1}
     * @param extend true/false，可选，是否判断延长线相交
     * @returns 相交返回true否则false
     */
    lineIntersect(line1:JSON, line2:JSON, extend:Boolean):Boolean

    /**
     * 线段到线段的距离
     * 
     * @param line1 第一条线段如 {xs: -1, ys: 0, xe: 2, ye: 0}
     * @param line2 第二条线段如 {xs: 0, ys: -1, xe: 0, ye: 1}
     * @returns 距离
     */
    line2LineDis(line1:JSON, line2:JSON):Number

    /**
     * 多边形到多边形的距离
     * 多边形即点的列表
     * 
     * @param p1 第一个多边形，如： [{x: .0, y: .0}, {x: 1, y: 1}, {x: 2, y:2}]
     * @param p2 第二个多边形，如： [{x: .0, y: -1}, {x: 1, y: 1}, {x: 2, y:2}]
     * @returns 距离
     */
    polygon2PolygonDis(p1:[JSON], p2:[JSON]):Number

    /**
     * 点到多边形的距离
     * 
     * @param p 点如 {x: 0, y: 0}
     * @param poly 多边形如 [{x: .0, y: -1}, {x: 1, y: 1}, {x: 2, y:2}]
     * @returns 距离
     */
    point2PolygonDis(p:JSON, poly:[JSON]):Number

    /**
     * 线段到多边形的距离
     * 
     * @param line 线段如 {xs: -1, ys: 0, xe: 2, ye: 0}
     * @param poly 多边形如 [{x: .0, y: -1}, {x: 1, y: 1}, {x: 2, y:2}]
     * @returns 距离
     */
    line2PolygonDis(line:JSON, poly:[JSON]):Number

    /**
     * 将sym转为多边形
     * sym是代表一个形状；
     * 主要有三种：如下：
     * 1. r10.4表示直径为0.0104的圆形
     * 2. s12.4表示开宽为0.0124的正方形
     * 3. rect10.2x12.4表示长为0.0102,宽为0.0124的长方形
     * 
     * 
     * { "type":"line", "symbol":"r10.2", "xs": 0, "ys": 0,"xe": 1,"ye":1 }
     * { "type":"pad", "symbol":"rect10.2x20.2", "x":0, "y":1, "angle":90, "mirror":true}
     * { "type":"surface", "symbol":[{"x":0,"y":0},{"x":0,"y":1},{"x":1,"y":1},{"x":1,"y":0},{"x":0,"y":0}]}
     * 
     * @param sym 形状
     * @return 多边形（即点的列表）
     */
    sym2Polygon(sym:JSON):[JSON]

    /**
     * 点到形状的距离
     * 
     * @param p 点
     * @param sym 形状
     * @returns 距离
     */
    point2SymDis(p:JSON, sym:JSON):Number

    /**
     * 线段到形状距离
     * 
     * @param line 线段
     * @param sym 形状
     * @returns 距离
     */
    line2SymDis(line:JSON, sym:JSON):Number

    /**
     * 形状到形状距离
     * @param sym1 第一个形状
     * @param sym2 第二个形状
     * @returns 距离
     */
    sym2SymDis(sym1:JSON, sym2:JSON):Number

    /**
     * 形状到多个形状的最短距离
     * 
     * @param sym 形状
     * @param featlist 形状列表（即[sym]) 见 sym2Polygon
     * @returns 距离
     */
    sym2FeatlistDis(sym:JSON, featlist:[JSON]):Number

    /**
     * 判断形状到多个形状的最短距离是否小于给定值
     * 
     * @param sym 形状
     * @param featlist 形状列表（即[sym]) 见 sym2Polygon
     * @param dist 给的的距离 如 1.0
     * @returns true距离表示小于dist否则false
     */
    checkSymTouchFeatlist(sym:JSON, featlist:[JSON], dist:Number):Boolean

    /**
     * 线段到多个形状的最短距离
     * 
     * @param line 线段
     * @param feat 形状列表
     * @returns 距离
     */
    line2FeatlistDis(line:JSON, feat:[JSON]):Number

    /**
     * 获取固定y值的点列表
     * 
     * @param from 起始位置
     * @param to 终止位置
     * @param step 跳步
     * @param startFrom 起点 可取 min, max, center 表示起始为from, to, (from+to)/2
     * @param y 固定的 y值
     * @returns 点列表
     * 
     * @example
     * require("topsin.genmath");
     * 
     * var g = new GenMath();
     * var r = g.gpListLineX(0, 10, 4, "min", 1);
     * console.log(r);
     * 
     * => [{"x":0,"y":1},{"x":4,"y":1},{"x":8,"y":1}]
     */
    gpListLineX(from:Number, to:Number, step:Number, startFrom:String, y:Number):[JSON]

    /**
     * 获取固定x值的点列表
     * 参考 gpListLineX
     */
    gpListLineY(from:Number, to:Number, step:Number, startFrom:String, x:Number):[JSON]

    /**
     * 获取固定范围的点列表
     * 
     * @param box 范围
     * @param step 跳步
     * @param startAnchor 起始位置，可以是点如 {x: 1, y:2},可以是方向 west, south 表示 min; north, east表示max，默认为center
     * @param direct 方向，可选 "x" 和 "y"， 或者为空
     * @param type 类型，可选 "ring" 和 "snake"
     * @returns 点列表
     */
    gpListArea(area:JSON, step:Number, startAnchor:Object, direct:String, type:String):[JSON]

    /**
     * 返回pi值
     */
    pi():Number

    /**
     * 弧度转角度
     */
    rad2Deg(rad:Number):Number

    /**
     * 角度转弧度
     */
    deg2Rad(deg:Number):Number

    /**
     * 线段角度
     * 
     * @return 角度
     */
    lineAngle(line:JSON):Number

    /**
     * 绕基点旋转点
     * 
     * @param base 几点
     * @param point 要旋转的点
     * @returns 旋转后的点
     */
    rotatePoint(base:JSON, point:JSON):JSON

    /**
     * 返回给定角(∠ABC)的角度
     * 
     * @param B 顶点
     * @param A 点
     * @param C 点
     * @returns 角度
     */
    calcAngleThreePoints(B:JSON, A:JSON, C:JSON):Number

    /**
     * 获取线段上偏移起点给定长度的点
     * 
     * @param line 线段
     * @param len 长度
     * @return 点
     */
    calPointOnLine(line:JSON, len:Number):Number

    /**
     * 延长线段
     * 
     * @param line 线段
     * @param len 长度
     * @return 延长后的线段
     */
    extendLine(line:JSON, len:Number):JSON

    /**
     * 获取线段中点
     */
    getLineCenter(line:JSON):JSON

    /**
     * 判断点是否在线段上
     * @returns true在否则false
     */
    isPointOnLine(point:JSON, line:JSON):Boolean

    /**
     * 判断点和圆的位置关系
     * 
     * @param point 点
     * @param circle 圆,由圆心坐标和半径表示如: {x: .0, y: .0, r: 10}
     * @returns 位置关系，in, out, on 分别表示在圆外，在圆内，在圆上
     */
    isPointOnCircle(point:JSON, circle:JSON):String

    /**
     * 点到圆的两个切点
     * 
     * @returns 两个切点如 [p1, p2]
     */
    point2CircleTanget(point:JSON, circle:JSON):[JSON, JSON]

    /**
     * 弧分割为线段
     * 
     * 弧表示为 起点(xs, ys)+终点(xe, ye)+弧心(xc,yc)+方向(direction)，如
     *  {xs: .0, ys: .0, xe: 1, ye: 1, xc: .0, yc: .0, direction: "cw"}
     * 其中方向可取值为 "cw"或"ccw"
     * 
     * @param arc 弧
     * @param den 分母(denominator)即分割的份数
     * @returns 线段的列表
     * @example
     * 
     * require("topsin.genmath");
     * 
     * console.log(g.arc2Lines({xs: 0, ys:1, xe: 1, ye: 0, xc: 0, yc: 0, direction: "cw"}, 2));
     * 
     * => [{"xe":0.7071067811865476,"xs":1,"ye":0.7071067811865475,"ys":0},{"xe":0,"xs":0.7071067811865476,"ye":1,"ys":0.7071067811865475}]
     */
    arc2Lines(arc:JSON, den:Number):[JSON]

    /**
     * 将profile转为多边形
     * 
     * @return 点的列表
     */
    profile2Polygon(profile:String, den:Number):[JSON]

    /**
     * 弧长
     */
    arcLength(arc:JSON):Number

    /**
     * 获取自动排版结构
     * 
     * @param sub : [{datum=>{x=>?,y=>?},symbol=>?,points=>[{x=>?,y=>?},{x=>?,y=>?},...]},...]
     * @param panel : [{datum=>{x=>?,y=>?},symbol=>?,points=>[{x=>?,y=>?},{x=>?,y=>?},...]},...],
     * @param type : ['rotate','empty_set']
     * @returns 
     *   {
     *      rotate: 0|1,
     *      empty_set: 0|1,
     *      all_match: 0|1,
     *      ox: ?,
     *      oy: ?,
     *      points: [{x:?,y:?,angle:?},...],
     *   }
     */
    SubPanelSr(sub:[JSON], panel:[JSON]):JSON

    /**
     * 计算线段的k和b (y = kx + b)
     * 
     * @return {k:?, b:?} 垂直时k为Inf
     */
    getLineKb(line:JSON):JSON

    /**
     * 根据一对k，b值计算交点
     * 
     * @param kb1 : {k: 1, b: 2}
     * @param kb2 : {k: 0, b: 3}
     * @returns 交点{x:?, y:?}， 不存在则为undefined
     */
    getKblineIntersect(kb1:JSON, kb2:JSON):Object

    /**
     * 获取线段交点
     * 
     * @param line1 线段1
     * @param line2 线段2
     * @param extend 可选true或false表示是否判断延长线
     * @returns 交点{x:?, y:?}，不存在则为undefined
     */
    getLineIntersect(line1:JSON, line2:JSON, extend:Boolean):Object

    /**
     * 获取点列表中点的最小间隔
     * 
     * @param l 点列表
     * @returns 距离
     */
    getPlistMinDis(l:[JSON]):Number

    /**
     * 获取一个点列表里的中心距离小于dis的点列表
     * @param dis : 最小距离
     * @param l : [{x=>?,y=>?,r=>?},{x=>?,y=>?},...], #r代表圆形直径
     * @return : { points: [{x:?,y:?},...], lines: [{xs:?,ys:?,xe:?,ye:?},..] }
     */
    getPlistLtDistance(dis:Number, l:[JSON]):[JSON, JSON]

    /**
     * 获kb线经过某一点的垂线
     * 
     * @param kb : {k:?, b:?}
     * @param point: {x: ?, y:? }
     * @returns 垂线的kb {k:?, b:?}
     */
    getKbLinePrependicular(kb:JSON, point:JSON):JSON

    /**
     * 获kb线距离一定值的平行线,距离正负依X值
     * 
     * @param kb : {k:?, b:?}
     * @param dis 距离
     * @returns 平行线的kb : {k:?, b:?}
     */
    getKblineParallel(kb:JSON, dis:Number):JSON

    /**
     * 获取线段距离一定值的平行线段
     * 
     * @param line 线段
     * @param dis 距离
     * @returns 平行的线段
     */
    getLineParallel(line:JSON, dis:Number):JSON

    /**
     * 获取偏移一定距离的折线
     * 
     * @param polyline 折线
     * @param dis 距离
     * @returns 新的折线
     */
    polylineOffset(polylin:JSON, dis:Number):JSON

    /**
     * box是否相交
     * box见 resizeBox
     */
    isRangeIntersect(box1:JSON, box2:JSON, tolerance:Number):Boolean

    /**
     * 解析叠构
     */
    analyzeStackup(par:JSON):JSON
}