def costurnangle(fromm,to): v = fromm[0]-to[0] u = fromm[1]-to[1] if v == 0: return 0 if u==0: return 1.579 r = math.sqrt(v*v + (u)*(u)) point = [v,u] length = math.sqrt((v-r)*(v-r) + u*u) if v/u>0: return math.acos( (length*length - 2*r*r)/(2*r*r)) return -math.acos((length * length - 2 * r * r) / (2 * r * r))
def distance_on_unit_sphere(self, coord1, coord2, lat_lon=None): # todo: need to make this work with ellipsoid earth models for more accurate distance calculations # todo: """ Calculate the distance on a spherical earth model with radius hard-coded. :param coord1: start coordinates :param coord2: end coordinates :param lat_lon: Optional: give either 'lat' or 'lon' to get just the lateral or longitudinal distances by themselves :return: return the distance in km """ if lat_lon is not None: if lat_lon is 'lat': lat1, lon1 = coord1.lat, coord1.lon lat2, lon2 = coord1.lat, coord2.lon elif lat_lon is 'lon': lat1, lon1 = coord1.lat, coord1.lon lat2, lon2 = coord2.lat, coord1.lon else: raise Exception("lat or lon not specified") else: lat1, lon1 = coord1.lat, coord1.lon lat2, lon2 = coord2.lat, coord2.lon # Convert latitude and longitude to # spherical coordinates in radians degrees_to_radians = math.pi / 180.0 # phi = 90 - latitude phi1 = (90.0 - lat1) * degrees_to_radians phi2 = (90.0 - lat2) * degrees_to_radians # theta = longitude theta1 = lon1 * degrees_to_radians theta2 = lon2 * degrees_to_radians # Compute spherical distance from spherical coordinates. # For two locations in spherical coordinates # (1, theta, phi) and (1, theta', phi') # cosine( arc length ) = # sin phi sin phi' cos(theta-theta') + cos phi cos phi' # distance = rho * arc length cos = (math.sin(phi1) * math.sin(phi2) * math.cos(theta1 - theta2) + math.cos(phi1) * math.cos(phi2)) """ @todo: need to implement domain check""" arc = math.acos(cos) return arc * self.semimajor # scale to return in km
def distance_on_unit_sphere(coord1, coord2, units='km'): # todo: need to make this work with ellipsoid earth models for more accurate distance calculations # todo: """ Calculate the distance on a spherical earth model with radius hard-coded. :param coord1: start coordinates :param coord2: end coordinates :param units: choose whether to return in km or feet :return: return the distance in km """ lat1, lon1 = coord1.lat, coord1.lon lat2, lon2 = coord2.lat, coord2.lon # Convert latitude and longitude to # spherical coordinates in radians degrees_to_radians = math.pi / 180.0 # phi = 90 - latitude phi1 = (90.0 - lat1) * degrees_to_radians phi2 = (90.0 - lat2) * degrees_to_radians # theta = longitude theta1 = lon1 * degrees_to_radians theta2 = lon2 * degrees_to_radians # Compute spherical distance from spherical coordinates. # For two locations in spherical coordinates # (1, theta, phi) and (1, theta', phi') # cosine( arc length ) = # sin phi sin phi' cos(theta-theta') + cos phi cos phi' # distance = rho * arc length cos = (math.sin(phi1) * math.sin(phi2) * math.cos(theta1 - theta2) + math.cos(phi1) * math.cos(phi2)) """ @todo: need to implement domain check""" arc = math.acos(cos) if units is 'km': return arc * 6373 else: return arc * 3960
def lat_lon_distance_on_unit_sphere(coord1, coord2, lat_lon, units='km'): """ Compute either the lateral or longitudinal distance from on point to another; This corresponds to finding the length of one of the legs of the right triangle between the two points. :param coord1: start coordinates :param coord2: end coordinates :param units: choose whether to return in km or miles :return: distance in units specified by 'units' param """ if lat_lon is 'lat': lat1, lon1 = coord1.lat, coord1.lon lat2, lon2 = coord1.lat, coord2.lon elif lat_lon is 'lon': lat1, lon1 = coord1.lat, coord1.lon lat2, lon2 = coord2.lat, coord1.lon else: raise Exception("lat or lon not specified") # Convert latitude and longitude to # spherical coordinates in radians degrees_to_radians = math.pi / 180.0 # phi = 90 - latitude phi1 = (90.0 - lat1) * degrees_to_radians phi2 = (90.0 - lat2) * degrees_to_radians # theta = longitude theta1 = lon1 * degrees_to_radians theta2 = lon2 * degrees_to_radians cos = (math.sin(phi1) * math.sin(phi2) * math.cos(theta1 - theta2) + math.cos(phi1) * math.cos(phi2)) arc = math.acos(cos) # Remember to multiply arc by the radius of the earth # in your favorite set of units to get length. if units is 'km': return arc * 6373 else: return arc * 3960
def Evolvent(self): '''Расчет эвольвенты зуба ''' #Расчет эвольветы зуба # Читаем данные из полей формы # z = Количество зубьев z = self.doubleSpinBox_Z.value() # m = Модуль зуба m = self.doubleSpinBox_m.value() # a = Угол главного профиля a = self.doubleSpinBox_a.value() #b = Угол наклона зубьев b = self.doubleSpinBox_b.value() #ha = Коэффициент высоты головки ha = self.doubleSpinBox_ha.value() #pf = К-т радиуса кривизны переходной кривой pf = self.doubleSpinBox_pf.value() #c = Коэффициент радиального зазора c = self.doubleSpinBox_c.value() #x = К-т смещения исходного контура x = self.doubleSpinBox_x.value() #y =Коэффициент уравнительного смещения y = self.doubleSpinBox_y.value() # n= Количество точек (точность построения) #n=int(self.doubleSpinBox_n.value()) n=100 # заполня переменные # Делительный диаметр d = z * m # Высота зуба h= h = 2.25 * m # Высота головки ha = hav = m # Высота ножки hf= hf = 1.25 * m #Диаметр вершин зубьев #da = d + (2 * m)*(ha+x+y) da = d + 2 * (ha + x - y) * m #Диаметр впадин (справочно) #df = d -(2 * hf) df = d -2 * (ha + c - x) * m #Окружной шаг зубьев или Шаг зацепления по дуге делительной окружности: Pt или p pt = math.pi * m #Окружная толщина зуба или Толщина зуба по дуге делительной окружности: St или S #Суммарный коэффициент смещений: XΣ X = 0.60 + 0.12 # St = 0.5 * pf # St = 0.5 * pt St = 0.5 * pt + 2 * x * m * math.tan(math.radians(a)) #inv a inva=math.tan(math.radians(a))-math.radians(a) #Угол зацепления invαw invaw= (2 * X - math.tan(math.radians(a))) / (10+26) + inva #Угол профиля at = math.ceil(math.degrees(math.atan(math.tan(math.radians(a)) /math.cos( math.radians(b))))) # Диаметр основной окружности db = d * math.cos(math.radians(at)) #Диаметр начала выкружки зуба D = 2 * m * ( ( z/( 2 * math.cos(math.radians(b)) )-(1-x)) ** 2 + ((1-x)/math.tan(math.radians(at)))**2)**0.5 #Промежуточные данные yi = math.pi/2-math.radians(at) hy = yi/(n-1) x0 = math.pi/(4*math.cos(math.radians(b)) )+pf*math.cos(math.radians(at))+math.tan(math.radians(at)) y0 = 1-pf*math.sin(math.radians(at))-x C = (math.pi/2+2*x*math.tan(math.radians(a)) )/z+math.tan(math.radians(at))-math.radians(at) #Расчетный шаг точек эвольвенты hdy = (da-D)/(n-1) dyi = da fi = 2*math.cos(math.radians(b))/z*(x0+y0*math.tan(yi)) #Заполняем текстовые поля в форме # Делительный диаметр # self.lineEdit_d.setText(str(d)) # Высота зуба h= # self.lineEdit_h.setText(str(h)) # Высота головки ha = # self.lineEdit_ha.setText(str(hav)) # Высота ножки hf= # self.lineEdit_hf.setText(str(hf)) # Диаметр вершин зубьев # self.lineEdit_da.setText(str(da)) # Диаметр впадин (справочно) # self.lineEdit_df.setText(str(df)) # Окружной шаг зубьев Pt= # self.lineEdit_Pt.setText(str(math.ceil(pt))) # Окружная толщина зуба St= # self.lineEdit_St.setText(str(math.ceil(St))) # Угол профиля # self.lineEdit_at.setText(str(at)) # Диаметр основной окружности # self.lineEdit_db.setText(str(math.ceil(db))) # Создаем списки List_dyi=[] List_Di=[] List_Yei=[] List_Xei=[] List_Minus_Xei=[] List_Xdai=[] List_Ydai=[] List_yi=[] List_Ai=[] List_Bi=[] List_fi=[] List_Ypki=[] List_Xpki=[] List_Minus_Xpki=[] # Заполняем нуливой (первый )индекс списка значениями List_dyi.append(dyi) List_Di.append( math.acos( db/ List_dyi[0] ) - math.tan( math.acos( db / List_dyi[0] ) ) + C ) List_Yei.append(dyi / 2*math.cos( List_Di[0])) List_Xei.append(List_Yei[0]*math.tan(List_Di[0])) List_Minus_Xei.append(-List_Xei[0]) List_Xdai.append(-List_Xei[0]) List_Ydai.append(((da/2)**2-List_Xdai[0]**2)**0.5) hda=(List_Xei[0]-List_Minus_Xei[0])/(n-1) # Заполняем первый (второй по счету )индекс списка значениями List_dyi.append(dyi-hdy) List_Di.append( math.acos(db/List_dyi[1])-math.tan(math.acos(db/List_dyi[1]))+C) List_Yei.append( List_dyi[1]/2*math.cos(List_Di[1])) List_Xei.append( List_Yei[1]* math.tan(List_Di[1])) List_Minus_Xei.append(-List_Xei[1]) List_Xdai.append(List_Xdai[0]+hda) List_Ydai.append(((da/2)**2-List_Xdai[1]**2)**0.5) Xdai=List_Xdai[1] dyi=dyi-hdy # Начинаем заполнять списки в цикле i=0 while i < n-2: i=i+1 dyi=dyi-hdy List_Di.append(math.acos(db/dyi)-math.tan(math.acos(db/dyi))+C) Di=math.acos(db/dyi)-math.tan(math.acos(db/dyi))+C Yei=dyi/2*math.cos(Di) Xei=Yei*math.tan(Di) List_dyi.append(dyi) List_Yei.append(dyi/2*math.cos(Di)) List_Xei.append(Yei*math.tan(Di)) List_Minus_Xei.append(-Xei) Xdai=Xdai+hda List_Xdai.append(Xdai) List_Ydai.append(((da/2)**2-Xdai**2)**0.5) #Заполняем последний индекс списка List_dyi[n-1]=D # Заполняем нуливой (первый )индекс списка значениями List_yi.append(yi) List_Ai.append(z/(2*math.cos(math.radians(b)))-y0-pf*math.cos(List_yi[0]) ) List_Bi.append(y0*math.tan(List_yi[0])+pf*math.sin(List_yi[0])) List_fi.append(fi) List_Ypki.append((List_Ai[0] * math.cos(fi)+List_Bi[0] * math.sin(fi)) * m) List_Xpki.append((List_Ai[0] * math.sin(fi)-List_Bi[0] * math.cos(fi)) * m) List_Minus_Xpki.append(-List_Xpki[0]) # Начинаем заполнять списки в цикле i=0 while i < n-2: i=i+1 yi=yi-hy List_yi.append(yi) Ai = z / (2 * math.cos(math.radians(b)))-y0-pf*math.cos(yi) List_Ai.append( z / (2 * math.cos(math.radians(b)))-y0-pf*math.cos(yi)) Bi =y0*math.tan(yi)+pf*math.sin(yi) List_Bi.append(y0*math.tan(yi)+pf*math.sin(yi)) fi = 2*math.cos(math.radians(b))/z*(x0+y0*math.tan(yi)) List_fi.append(2*math.cos(math.radians(b))/z*(x0+y0*math.tan(yi))) List_Ypki.append((Ai*math.cos(fi)+Bi*math.sin(fi))*m) Ypki=(Ai*math.cos(fi)+Bi*math.sin(fi))*m Xpki=(Ai*math.sin(fi)-Bi*math.cos(fi))*m List_Xpki.append((Ai*math.sin(fi)-Bi*math.cos(fi))*m) List_Minus_Xpki.append(-Xpki) #Заполняем последний индекс списка List_yi.append(yi-yi) List_Ai.append(z/(2*math.cos(math.radians(b)))-y0-pf*math.cos(List_yi[n-1]) ) List_Bi.append(y0*math.tan(List_yi[n-1])+pf*math.sin(List_yi[n-1])) List_fi.append(2*math.cos(math.radians(b))/z*(x0+y0*math.tan(List_yi[n-1]))) List_Ypki.append((List_Ai[n-1] * math.cos(fi)+List_Bi[n-1] * math.sin(List_fi[n-1])) * m) List_Xpki.append((List_Ai[n-1] * math.sin(fi)-List_Bi[n-1] * math.cos(List_fi[n-1])) * m) List_Minus_Xpki.append(-List_Xpki[n-1]) # self.WiPfileZub(List_Yei,List_Xei,List_Minus_Xei,List_Ypki,List_Xpki,List_Minus_Xpki,List_Ydai,List_Xdai) self.GragEvolvent(List_Minus_Xei+List_Minus_Xpki,List_Yei+List_Ypki,n) DFreza = self.lineEditDFreza.text() VisotaYAxis = self.lineEditVisota.text() Diametr = self.lineEditDiametr.text() if DFreza and VisotaYAxis: E30 = (int(DFreza)/2) +float(VisotaYAxis) else: E30 = 0 angi_B=0 if ValkosZub: angie_A:float = 90# угол А треугольника по высоте детали angie_B:float = float(b) #угол B треугольника по высоте детали ( угол наклона зуба по чертежу) angie_Y:float = 180 - (angie_A + angie_B) # трерий уго треугольника по высоте детали side_c:float = float(E30)# высота детали первая сторона треугольника side_a = side_c * math.sin(math.radians(angie_A)) / math.sin(math.radians(angie_Y))# вторая сторона треугольника side_b = side_c * math.sin(math.radians(angie_B)) / math.sin(math.radians(angie_Y))# третия сторона треугольника ( ось Х) sid_a:float = float(Diametr)/2 # радиус детали первая и вторая тророны треугольника по торцу # sid_a:float = float(self.lineEdit_da.text())/2 # радиус детали первая и вторая тророны треугольника по торцу sid_c:float = sid_a if sid_c < 10 : sid_a:float = 10 sid_c:float = 10 angi_B = float('{:.3f}'.format(math.degrees(math.acos((sid_a**2+sid_c**2-side_b**2)/(2*sid_a*sid_c))))) QMessageBox.about (self, "Ошибка " , "Диаметр шестерни задан меньше 20 мм. \n Введите риальный диаметр шестерни " ) else: angi_B = float('{:.3f}'.format(math.degrees(math.acos((sid_a**2+sid_c**2-side_b**2)/(2*sid_a*sid_c)))))# результат угол поворота стола self.label_da.setText(str(round(da,1))) self.label_d.setText(str(round(d,1))) self.label_at.setText(str(round(at,1))) self.label_db.setText(str(round(db,1))) self.label_df.setText(str(round(df,1))) self.label_St.setText(str(round(St,1))) self.label_Pt.setText(str(round(pt,1))) self.label_hf.setText(str(round(hf,1))) self.label_ha.setText(str(round(ha,1))) self.label_h.setText(str(round(h,1))) self.lineEditDiametr.setText(str(da)) self.lineEditUgol.setText(str(angi_B))