Python计算两点直线方程&点线距离程序
本文最后更新于 408 天前,其中的信息可能已经有所发展或是发生改变。

小编最近一直在写一些关于数学的小程序,譬如线性回归方程,两点直线方程啊之类的,用起来也还都挺顺手的,不过代码实在是写的够呛,纷纷然然的数学世界,让我无力把代码写好,只求运行不出错,加上tkinter的有些尿性,自然是更无法接受了·······

不过幸好后来我机智的找到了TTK,把界面算是调的漂亮一点,再也不像牛皮癣广告了,毕竟也就200行的小程序,费不着用Qt了,要不然又有人说杀鸡用牛刀,大炮打蚊子了。
不过听说QT能用CSS写控制————“这简直是BUG”,看来HTML与桌面应用以后会结合的很紧密,CSS3的动画效果说不定能让开发者省去大量的时间,Tencent QQ那个炫酷的登陆界面“貌似”就是拿JS写的(又是嘴炮······)

打包完成的版本 : 下载地址
声明:因为pyinstaller打包并用UPX的原因(其实我也不知道),软件打开会很慢,我这里有7秒,不过打开之后运算到没什么影响

软件截图(那个图标是从上次写主题的字体中找的示例图,做成ICO的,还挺好看~~):

Straight Line Calculator

下面贴代码时间,说到代码,我给这个小软件加了一个GPL V3协议,这也是我第一次这么干,不是觉得我代码写的有多好(说实在,这次写的代码里用了很多新手都不会使用的非常笨拙的技能),只是觉得版权是软件一个很重要的部分,而不是装饰
以下是源代码(有一部分我从原来的小项目直接拿来用了,可以参见原来的帖子):

#/usr/bin/python
#Author:[email protected]

"""
Copyright (c) 2015 Jack Gui
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see .
"""

import traceback
from tkinter import *
from tkinter.ttk import *
import tkinter.messagebox as messagebox
import webbrowser
root = Tk()

# 帮助窗体生成函数
def get_help():
    global Get_help
    get_Help = Get_help(root)
class Get_help:
    def __init__(self,parent):
        self.parent = parent
        help_window = Toplevel(parent)
        help_window.iconbitmap('D:/cal/ico.ico')
        self.help_window = help_window
        help_window.geometry("400x350")
        help_window.title("帮助&更多")
        help_window.resizable(False,False)
        help_text = Message(help_window,text=
            """这是一个计算两点直线方程以及点线距离的小程序
            \nX1,Y1,X2,Y2分别表示要确定直线的两点坐标
            \nX3,Y3表示需要计算到上面直线距离的点
            \n在您输入并且计算出直线方程之前,X3,Y3不可用
            \n当您同时改变了方程坐标与第三点坐标时,需要重新计算直线方程
            \n为了方便计算,计算出来的直线方程为一般式
            \nTips:您可以使用TAB键来在输入框之间快速切换
            \n清空按钮将清空所有输入框的值,并将计算结果全部初始化
            \n软件源码遵守GPL V3.0协议""",width="420").pack()
        Button(help_window,text="源代码及更多",command=self.more).place(x=25,y=307)
        Button(help_window,text="关闭",command=self.close).place(x=290,y=307)
        Button(help_window,text="关于GPL协议",command=self.GPL).place(x=160,y=307)
    def more(self):
        webbrowser.open("https://init.blog/archives/912")
    def GPL(self):
        webbrowser.open("http://www.gnu.org/licenses/gpl-3.0.html")
    def close(self):
        self.help_window.destroy()

# 获得最大公约数函数,参考部分来自网易博客的程序以及辗转相除法
def gcd(m,n):
    m,n = abs(m),abs(n)
    if m 5:
                messagebox.showerror("输入错误","%s框中数值超出范围(5位数以内)"%ero_times)
                return 0
            __coor__.append(float(times.get()))
    if __coor__[1]==__coor__[3]:
        messagebox.showerror("数学错误","当Y1=Y2时计算K的分母为0(计算无效)")
        __coor__ = []
        return 0
    if __coor__[0]==__coor__[2]:
        messagebox.showerror("数学错误","当X1=X2时计算A值为零,平行于X轴")
        error_coor = True
    else:
        error_coor = False
    X3.configure(state=NORMAL)
    Y3.configure(state=NORMAL)
    cal_button.configure(state=ACTIVE)
    root.geometry("330x230")
    del_button.configure(state=ACTIVE)
    root.update()
    k_up = (__coor__[1]-__coor__[3])
    k_down = (__coor__[0]-__coor__[2])
    num = int(gcd(k_up,k_down))
    global A
    A = int(k_up/num)
    global B
    B = int(k_down/num*-1)
    global C
    C = int((__coor__[0]*k_up-k_down*__coor__[1])/num*-1)
    ans = ""
    if A == -1:
        ans += "-X"
    elif A == 1:
        ans += "X"
    elif A == 0:
        ans += ""
    else:
        ans += str(A)+"X"
    if B == -1:
        ans += "-Y"
    elif B == 1:
        ans += "+Y"
    elif B == 0:
        ans += ""
    else:
        if B > 0:
            ans += "+"+str(B)+"Y"
        else:
            ans += str(B)+"Y"
    if C > 0:
        ans += "+"+str(C)
    elif C == 0:
        ans += ""
    else:
        ans += str(C)
    ans += " = 0"
    if error_coor:
        ans += " (**A=0**)"
    equation = Label(text=("直线方程:"+ans),foreground="red")
    equation.place(y=180,x=((330-(len(ans)*10))/2)-8)
    del num,ans

# 计算点到直线距离函数
def cal_dis():
    global A
    global B
    global C
    global dis_ans
    try:
        dis_ans.destroy()
    except:
        pass
    X = X3.get()
    Y = Y3.get()
    if len(X) > 5 or len(Y) > 5:
        messagebox.showerror("数据错误","数值长度超过限度!")
        return 0
    dis_up = abs(int(A)*int(X)+int(B)*int(Y)+int(C))
    dis_down = (A**2+B**2)**0.5
    root.geometry("330x250")
    dis = dis_up/dis_down
    if len(str(dis)) >= 5:
        dis = "点到直线的距离:"+str(round(dis_up,2))+"/"+str(round(dis_down,2))+"(≈"+str(round(dis_up/dis_down,3))+")"
    else:
        dis = "点到直线的距离:"+str(round(dis,4))
    dis_ans = Label(text=dis,foreground="red")
    dis_ans.pack(side="bottom",expand=False,fill=NONE,pady=30)

# 清除按钮回调函数
def del_coor():
    try:
        global equation
        global dis_ans
        equation.destroy()
        dis_ans.destroy()
    except:
        pass
    global __coor__
    __coor__ = []
    for times in [X1,Y1,X2,Y2,X3,Y3]:
        try:
            times.delete(0,END)
        except:
            pass
    X3.configure(state=DISABLED)
    Y3.configure(state=DISABLED)
    cal_button.configure(state=DISABLED)
    root.geometry("330x208")
    root.update()

# 主界面生成与布局
x1,y1,x2,y2,x3,y3=StringVar(),StringVar(),StringVar(),StringVar(),StringVar(),StringVar()
X1=Entry(root,textvariable=x1,width="10",font=('Microsoft Yahei','10','bold'))
X1.place(x="60",y="18")
Y1=Entry(root,textvariable=y1,width="10",font=('Microsoft Yahei','10','bold'))
Y1.place(x="192",y="18")
X2=Entry(root,textvariable=x2,width="10",font=('Microsoft Yahei','10','bold'))
X2.place(x="60",y="41")
Y2=Entry(root,textvariable=y2,width="10",font=('Microsoft Yahei','10','bold'))
Y2.place(x="192",y="41")
X3=Entry(root,textvariable=x3,width="10",font=('Microsoft Yahei','10','bold'),state=DISABLED)
X3.place(x="60",y="108")
Y3=Entry(root,textvariable=y3,width="10",font=('Microsoft Yahei','10','bold'),state=DISABLED)
Y3.place(x="192",y="108")
Label(text="X1:").place(x="32",y="17")
Label(text="Y1:").place(x="164",y="17")
Label(text="X2:").place(x="32",y="41")
Label(text="Y2:").place(x="164",y="41")
Label(text="X3:").place(x="32",y="108")
Label(text="Y3:").place(x="164",y="108")
Label(text="作者:[email protected]",foreground="blue").place(relx="0.27",rely="0.87")
cal_line_Button = Button(text="计算直线方程",command=cal_line)
cal_line_Button.place(x="60",y="71")
cal_button = Button(text="计算距直线距离",command=cal_dis,state=DISABLED)
cal_button.place(x="60",y="140")
del_button = Button(text="清空",command=del_coor)
del_button.place(x="193",y="71")
help_button = Button(text="帮助",command=get_help)
help_button.place(x="193",y="140")
cal_line_Button.bind('',cal_line)
X1.focus_set()
root.title("两点方程距离计算")
root.resizable(False,False)
root.iconbitmap('D:/cal/ico.ico')
root.geometry("330x208+200+20")
if __name__ == "__main__":
    root.mainloop()

请大神无视那里大量的IF判断,半夜很困了,是在不愿意想还有什么简便方案
小时候上英文补习班,老师给起的土锤名字 Jack 请默默无视

评论

  1. S.M╭⌒倾心之恋
    5年前
    2015-6-07 19:56:41

    蛮好的 挺实用的,帮助很大

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇