Go 语言: 极坐标与笛卡尔坐标的互转

前端之家收集整理的这篇文章主要介绍了Go 语言: 极坐标与笛卡尔坐标的互转前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文记录使用 Go 语言实现 RESTful 的点坐标的转换。

极坐标与笛卡尔坐标的数学关系

假设同一个点使用极坐标表示为 (ρ,θ),使用笛卡尔坐标表示为(x,y),那么,这些数学符号之间,有如下关系

x = ρ* Cosθ

y = ρ* Sinθ

ρ= Sqrt(x*x+y*y)

θ = Arctan(x/y)


Go语言实现

/*
*@Author:coolwp.com
*@Date:2017-09-1216:25:34
*@LastModifiedby:suifengtec
*@LastModifiedtime:2017-09-1216:41:35
**/
/*
gobuild-oa.exemain.go
*/
packagemain

import(
	"encoding/json"
	"fmt"
	"github.com/gorilla/mux"
	"log"
	"math"
	"net/http"
	"strconv"
	"strings"
)

typeDotJstruct{
	Rfloat64`json:"r"`
	Afloat64`json:"a"`
}

typeDotDstruct{
	Xfloat64`json:"x"`
	Yfloat64`json:"y"`
}

/*typeDotJs[]DotJ
typeDotDs[]DotD*/

/*
http://127.0.0.1:6688/d/12/5
{"r":13,"a":22.61986}
*/
funcdoD(whttp.ResponseWriter,r*http.Request){

	vars:=mux.Vars(r)
	errV:=0
	x,errX:=strconv.ParseFloat(strings.TrimSpace(vars["x"]),64)
	y,errY:=strconv.ParseFloat(strings.TrimSpace(vars["y"]),64)

	iferrX!=nil{
		fmt.Println("第1个值x输入错误!")
		errV=1
	}else{
		iferrY!=nil{
			fmt.Println("第2个值Y输入错误!")
			errV=2
		}
	}

	iferrV==0{
		w.Header().Set("Content-Type","application/json")

		r:=math.Sqrt(x*x+y*y)
		a:=math.atan(y/x)
		a=hudu2jiaodu(a)

		r=toFixed(r,5)
		a=toFixed(a,5)

		dotJ:=DotJ{R:r,A:a}
		json.NewEncoder(w).Encode(dotJ)

	}else{
		w.WriteHeader(404)
		fmt.Println("error:404")
	}
}

//极坐标转换为笛卡尔坐标
/*
http://127.0.0.1:6688/j/13/22.61986
{"x":12,"y":5}

*/
funcdoJ(whttp.ResponseWriter,r*http.Request){

	vars:=mux.Vars(r)
	errV:=0

	rr,errR:=strconv.ParseFloat(strings.TrimSpace(vars["r"]),64)
	aa,errA:=strconv.ParseFloat(strings.TrimSpace(vars["a"]),64)

	iferrR!=nil{
		fmt.Println("第1个值x输入错误!")
		errV=1
	}else{
		iferrA!=nil{
			fmt.Println("第2个值Y输入错误!")
			errV=2
		}
	}

	iferrV==0{
		w.Header().Set("Content-Type","application/json")
		aV:=jiaodu2hudu(aa)
		x:=rr*math.Cos(aV)
		y:=rr*math.Sin(aV)

		x=toFixed(x,5)
		y=toFixed(y,5)
		dotD:=DotD{X:x,Y:y}
		json.NewEncoder(w).Encode(dotD)

	}else{
		w.WriteHeader(404)
		fmt.Println("error:404")
	}
}

funchttpHandler(){
	myRouter:=mux.NewRouter().StrictSlash(true)
	//笛卡尔坐标转换为极坐标
	myRouter.HandleFunc("/d/{x}/{y}",doD)
	//极坐标转换为笛卡尔坐标
	myRouter.HandleFunc("/j/{r}/{a}",doJ)
	log.Fatal(http.ListenAndServe(":6688",myRouter))
}

/*======================================================*/
funcjiaodu2hudu(jiaodufloat64)float64{

	returnjiaodu*math.Pi/180
}
funchudu2jiaodu(hudufloat64)float64{

	returnhudu*180/math.Pi
}

funcround(numfloat64)int{
	returnint(num+math.Copysign(0.5,num))
}

functoFixed(numfloat64,precisionint)float64{
	output:=math.Pow(10,float64(precision))
	returnfloat64(round(num*output))/output
}

funcmain(){
	httpHandler()
	/*fireNow()*/
}

/*DEV:CLI使用*/
funcfireNow(){
	var(
		ρ,θ,x,yfloat64
	)
	methodType:=1
	fmt.Print("请选择转换方式:\n输入1,表示需要从极坐标转换为笛卡尔坐标;\n输入2,表示需要从笛卡尔坐标转换为极坐标\n?")
	fmt.Scan(&methodType)

	ifmethodType!=1&&methodType!=2{
		fmt.Println("貌似你输入的不是1,也不是2啊,搞哪样?")
		fireNow()
	}else{
		switchmethodType{

		//输入1,表示需要从极坐标转换为笛卡尔坐标;
		case1:
			fmt.Println("请以极坐标格式输入点的坐标(ρ和θ之间用1个空格隔开,θ默认为弧度单位)?")
			fmt.Scan(&ρ,&θ)
			θ=jiaodu2hudu(θ)
			x=ρ*math.Cos(θ)
			y=ρ*math.Sin(θ)
			fmt.Printf("x=%f,y=%f\n",y)
		//输入2,表示需要从笛卡尔坐标转换为极坐标
		case2:

			fmt.Println("请以笛卡尔坐标格式输入点的坐标(x和y之间用1个空格隔开,x不能为0)?")
			fmt.Scan(&x,&y)
			ρ=math.Sqrt(x*x+y*y)
			θ=math.atan(y/x)
			θ=hudu2jiaodu(θ)
			fmt.Printf("ρ=%f,θ=%f\n",ρ,θ)
		}
	}
}


笛卡尔坐标转极坐标示例 URL

http://127.0.0.1:6688/d/12/5

将会返回

{"r":13,"a":22.61986}

极坐标转笛卡尔坐标示例URL

http://127.0.0.1:6688/j/13/22.61986

将会返回

{"x":12,"y":5}

两种转换默认精确到小数点后5位。

猜你在找的Go相关文章