go语言根据两个坐标(x1,y1)、(x2,x2),输出直线方程

// 输入两个坐标,求经过两坐标的直线方程
func Fx(x1, y1, x2, y2 int) string {
	if x1 == x2 && y1 == y2 { // 两个相同坐标,直接输出坐标值
		return "(" + strconv.Itoa(x1) + "," + strconv.Itoa(y1) + ")"
	}
	if x1 == x2 { //x坐标相同,直线垂直于x轴
		return "x=" + strconv.Itoa(x1)
	}
	if y1 == y2 { //y坐标相同,直线垂直y轴
		return "y=" + strconv.Itoa(y1)
	}
	a1, a2, _ := HuaJian(y1-y2, x1-x2)              //计算斜率a:(x1-x2)/(y1-y2),分数表示:a1/a2
	b1, b2, _ := HuaJian(y1*a2-a1*x1, a2)           //常数项分数表示:b1/b2
	f1 := strconv.Itoa(a1) + "/" + strconv.Itoa(a2) // a分母存在时
	f2 := "+"
	f3 := "/" + strconv.Itoa(b2) // b分母存在时候
	if a2 == 1 {                 // a分母等于1,不显示a分母
		f1 = strconv.Itoa(a1)
	}
	if a1 == a2 { // x系数为1时,不显示
		f1 = ""
	} else if a1 == -1 && a2 == 1 { // x系数为-1时,只显示负号
		f1 = "-"
	}
	if b1 == 0 { // 常数项为0时
		return "y=" + f1 + "x"
	}
	if b2 == 1 { // b分母等于1,不显示b分母
		f3 = ""
	}
	if b1 < 0 { // b为负数时候不显示+
		f2 = ""
	}
	return "y=" + f1 + "x" + f2 + strconv.Itoa(b1) + f3
}


// 整数形式分数化简:a/b,a、b均为整数
func HuaJian(a, b int) (int, int, error) {
	var c int           // 定义中间变量,用于循环整除最大值,也就是a,b中的最小数
	f := 1              // 结果的正负统一管理
	if a < 0 && b > 0 { // 结果为负数时,a、b统一调整为正数
		a = -a
		f = -1
	} else if a > 0 && b < 0 { // 结果为负数时,a、b统一调整为正数
		b = -b
		f = -1
	} else if a < 0 && b < 0 { // 结果为正数时,a、b统一调整为正数
		a = -a
		b = -b
	}
	if b == 0 { // 分母为0时,返回-1,-1,错误
		return -1, -1, fmt.Errorf("分母不能为0!")
	} else if a == 0 { // 分子为0时,结果为0,1
		return 0, 1, nil
	}
	if a == b { // a=b时,返回
		return f * 1, 1, nil
	} else if a < b { // 将a,b最小数复制给中间变量c
		c = a
	} else {
		c = b
	}
	for i := 2; i <= c; i++ { // 从2开始进行整除
		if b%i == 0 { // b能整除
			if a%i == 0 { // a能被整除
				b = b / i // b约分
				a = a / i // a约分
			}
		}
	}
	return f * a, b, nil // 返回
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值