本文记录使用 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*/packagemainimport("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[]DotJtypeDotDs[]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:=0x,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:=0rr,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:=1fmt.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",x,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位。