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

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

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

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

x = ρ* Cosθ

y = ρ* Sinθ

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

θ = Arctan(x/y)

Go语言实现

/*
* @Author: coolwp.com
* @Date: 2017-09-12 16:25:34
* @Last Modified by: suifengtec
* @Last Modified time: 2017-09-12 16:41:35
**/
/*
go build -o a.exe  main.go
*/
package main

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

type DotJ struct {
	R float64 `json:"r"`
	A float64 `json:"a"`
}

type DotD struct {
	X float64 `json:"x"`
	Y float64 `json:"y"`
}

/*type DotJs []DotJ
type DotDs []DotD*/

/*
http://127.0.0.1:6688/d/12/5
{"r":13,"a":22.61986}
*/
func doD(w http.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)

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

	if errV == 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}

*/
func doJ(w http.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)

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

	if errV == 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")
	}
}

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

/*======================================================*/
func jiaodu2hudu(jiaodu float64) float64 {

	return jiaodu * math.Pi / 180
}
func hudu2jiaodu(hudu float64) float64 {

	return hudu * 180 / math.Pi
}

func round(num float64) int {
	return int(num + math.Copysign(0.5, num))
}

func toFixed(num float64, precision int) float64 {
	output := math.Pow(10, float64(precision))
	return float64(round(num*output)) / output
}

func main() {
	httpHandler()
	/*fireNow()*/
}

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

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

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

			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位。

时间: 2024-10-13 14:42:41

Go 语言: 极坐标与笛卡尔坐标的互转的相关文章

实验c语言不同类型的指针互用(不推荐只是学习用)

#include <stdio.h> int main(int argc, char *argv[]) { printf("Hello, world\n"); char c[4]; int *p = NULL; p = (int *)(&c[0]); *p = 0X01020304; printf("%d--%d--%d--%d--",c[0],c[1],c[2],c[3]); return 0; } 结果是:4--3--2--1 指针步长,字符

使用swift语言进行IOS应用开发

在Swift中能够直接使用Objective-C语言提供的api (包括系统框架与自己的定制代码),也能够在Objective-C中使用Swift提供的类和api ,还能够在一个工程中同时混合使用Swift 和Objective-C两种语言,两种语言之间能够互通和互用. 任意Objective-C的框架或C库(包括所有的Objective-C系统框架,例如Foundation.UIKit.SpriteKit以及系统提供的公共c库)作为模块被直接导入Swift 供Swift语言使用. 例如为了使用

怎样认识语言和思维的关系

人类面对自然界的现实是相同的,大脑的生理构造也一样,因而具有共同的思维能力.任何复杂的现象不同民族的人都有能力认识它.不同民族有共同的思维能力不等于他们有共同的思维方式.思维能力和思维方式是两个不同的概念.思维能力指能不能认识现实,这一点不同的民族没有什么差异,即思维能力是全人类相同的,而思维方式是指如何实现这种能力,这一点不同的民族是不一样的,即思维方式具有民族的特点. 不同民族认识世界的方式是不同的,也就是思维方式上有差别,这些差异我们可以通过对不同语言的比较来加以考察,这些我们从不同民族给

笛卡尔(x,y)空间和数极坐标(log r,角度phi)的互相转换

原理: 数极坐标是对物体视场的一种不变表示,比如所有的正方形都是一样的,产生了一类二维旋转和尺度的不变性 rho=M*log(sqrt(x2+y2)) phi=atan(y/x) 核心函数: cvLogPolar 效果: 代码: #include "cv.h" #include "cxcore.h" #include "highgui.h" #include <iostream> int LogPolar(int argc,char*

第十章:Javascript子集和扩展

本章讨论javascript的集和超集,其中子集的定义大部分处于安全考虑.只有使用这门语言的一个安全的子集编写脚本,才能让代码执行的更安全.更稳定.ECMScript3标准是1999年版本的,10年后,ECMAScript5规范的更新,由于ECMAScript标准规范是允许对其做任何扩充的,伴随着Mozilla项目的改进,Firefox1.0.1.5.2.3.和3.5版本中分别发布了javascript1.5.1.6.1.7.1.8.1.81版本,这些javascript的扩展版本已经融入到EC

python数字图像处理(15):霍夫线变换

在图片处理中,霍夫变换主要是用来检测图片中的几何形状,包括直线.圆.椭圆等. 在skimage中,霍夫变换是放在tranform模块内,本篇主要讲解霍夫线变换. 对于平面中的一条直线,在笛卡尔坐标系中,可用y=mx+b来表示,其中m为斜率,b为截距.但是如果直线是一条垂直线,则m为无穷大,所有通常我们在另一坐标系中表示直线,即极坐标系下的r=xcos(theta)+ysin(theta).即可用(r,theta)来表示一条直线.其中r为该直线到原点的距离,theta为该直线的垂线与x轴的夹角.如

023-Foundation框架(上)-OC笔记

学习目标 1.[理解]NSString 2.[了解]NSString的常用方法 3.[了解]NSRange 4.[了解]NSMutableString 5.[掌握]NSArray 6.[了解]NSArray的常用方法 7.[掌握]遍历数组的三种方式 8.[了解]NSArray与字符串 9.[掌握]NSMutableArray 一.NSString 在OC中,使用NSString类型的对象来保存一个字符串对象的地址,OC字符串必须要使用 @ 前缀.NSString其实是Foundation框架中的

NDT(Normal Distribution Transform) 算法(与ICP对比)和一些常见配准算法

原文地址:http://ghx0x0.github.io/2014/12/30/NDT-match/ By GH 发表于 12月 30 2014 目前三维配准中用的较多的是ICP迭代算法,需要提供一个较好的初值,同时由于算法本身缺陷,最终迭代结果可能会陷入局部最优.本文介绍的是另一种比较好的配准算法,NDT配准.这个配准算法耗时稳定,跟初值相关不大,初值误差大时,也能很好的纠正过来. 绪论: 采样: 3d点云数据在离相机近处点云密度大,远处密度小,所以在下采样时采用统一的采样方法还是会保留密度不

灰度图像--频域滤波 傅里叶变换之傅里叶级数

学习DIP第18天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意........ 0.开篇废话 废话开始,故事是这样的,当我上大学的时候,学过信号与系统,当时已经学了高的数学,也知道了傅里叶变换的公式,但是,公式是怎么来的,有什么用,不清楚,学信号与系统的时候,知道傅里叶用在什么地方,但是不清楚为什么可以用在这些地方,书中的记忆是:傅里叶变换或者其家族的变换