Zpravy

Python – Výpočet délky oblouku v souřadnicové rovině.

Jsou dány dvě souřadnice bodů (x1,y1 a x2,y2) a úhel oblouku mezi nimi. Musíme najít délku oblouku. Nemohu najít vzorec. Existují vzorce, ale vyžadují buď výšku oblouku, nebo poloměr kružnice. Tento údaj není specifikován. jak řešit?

Stopa
24k 3 3 zlatých odznaků 49 49 stříbrných odznaků 62 62 bronzových odznaků
zeptal se 24. června 2015 v 6:29
NurMuhammad NurMuhammad
11 2 2 bronzové odznaky
V první řadě bych chtěl pochopit, jak to vyřešit. A pokud se to splní, bude to skvělé.
Komentováno 24. června 2015 ve 7:13

Podle pravidel komunity by se otázky neměly omezovat pouze na plnění úkolů pro studenty. Uveďte příklad vaší implementace a popis konkrétních problémů.

Komentováno 24. června 2015 ve 7:26

@NicolasChabanovsky, jak je uvedeno v komentáři: nejprve pochopit, jak to vyřešit. Zhruba řečeno, Nežádám vás, abyste to udělali za mě, jen potřebuji nutně poradit, jak to zavést.. Druhý citát je z této otázky, která měla včera velký úspěch. Zde je ale více specifik a řešení (teoretické) je mnohem kratší. Takže ani nevím, jakými pravidly komunita žije.

Komentováno 24. června 2015 ve 7:38

@Regent Tato konkrétní otázka vypadá jako domácí úkol, navíc má velmi málo společného s programováním. Pokud jde o takové otázky obecně: pokud existují odborníci, kteří se o téma zajímají, pak otázka dostává odpovědi. V každém případě by bylo skvělé vidět příklad řešení, i když není správný. Děkuji za chybu, opravil jsem.

Komentováno 24. června 2015 ve 7:45

@NicolasChabanovsky by nerad zakládal diskuzi v komentářích (místo meta), jak tomu bylo již v komentářích k jedné z odpovědí na výše uvedenou otázku, ale přesto: obě otázky označují programovací jazyk, ve kterém je implementace plánováno, existuje úkol, který je k něčemu potřeba (test kurzu nebo jen domácí úkol), v otázce není implementace od autora. Pokud se najdou ochotní odborníci, nebráním se odpovědím, i když dojde k řešení autorovi obsáhlé otázky, která inspiruje lidi k tomu, aby se méně často pokoušeli problém vyřešit vlastními silami a častěji jej přesunuli na jiné

Komentováno 24. června 2015 ve 7:53
| Zobrazit více 2 komentáře

3 odpovědi 3

Řadit: Obnovit výchozí

Promiň, neviděl jsem úhel oblouku. Pak má problém řešení.

Pro začátek stojí za to najít délku tětivy překrývající požadovaný oblouk. Tuto délku lze snadno zjistit pomocí euklidovského vzorce vzdálenosti mezi body v rovině.

Dále musíte najít poloměr kruhu. Nejjednodušší způsob, jak ji najít, je z trojúhelníku tvořeného poloměrem, polovinou tětivy a kolmicí svrženou na tětivu ze středu kružnice. Pokud jste ale líní dělat geometrické konstrukce, můžete si vygooglovat vzorec na délku hodry, považovat to za rovnici a zjistit z toho poloměr.

A pak je vše jednoduché: délka oblouku se rovná poloměru vynásobenému úhlem.

Stopa
odpověděl 24. června 2015 ve 7:17
Pavel Mayorov Pavel Mayorov
59.3k 7 7 zlatých odznaků 77 77 stříbrných odznaků 150 150 bronzových odznaků
Pro jistotu upřesním: násobeno úhlem – úhel musí být v radiánech. A článek na Wikipedii.
Komentováno 24. června 2015 ve 7:21
Úhel vždy musí být v radiánech (s výjimkou zobrazení uživateli).
Komentováno 24. června 2015 ve 7:22
Vy tomu rozumíte, tomu rozumím, ale upřesnil jsem to pro autora a případné budoucí čtenáře.
Komentováno 24. června 2015 ve 7:40

Přečtěte si více
Nový život pro staré sídlo. V Krasnojarsku se staví muzejní čtvrť | AiF Krasnojarsk

Implementováno následující. cesta. Chci nastavit podmínku, že pokud je zadán úhel >=90, pak tuto hodnotu neakceptuji a vrátím se do pole pro zadání úhlu:

from math import * x1 = input("Vvedite x1: ") y1 = input("Vvedite y1: ") x2 = input("Vvedite x2: ") y2 = input("Vvedite y2: ") c = input("Vvedite ugol: ") l = pi*sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))*c/(180*sin(c)) print l 

Stopa
34.6k 26 26 zlatých odznaků 135 135 stříbrných odznaků 228 228 bronzových odznaků
odpověděl 24. června 2015 ve 14:10
NurMuhammad NurMuhammad
11 2 2 bronzové odznaky

Příklad řešení úlohy s komplexními čísly a kompasem.

def dlina_dugi(a,b,ugol_d): otrezok (a,b) c=(a+b)/2 tochka_imj (a,5) tochka_imj (b,5) tochka_imj_ev (c,"c",2) ugol_ab=(cmath.polar(b-a)[1]) dlina_ac=0.5*abs(b-a) ugol_ac_ad=(math.pi)/2-(ugol_d)/2 ugol_ad=-ugol_ac_ad+ugol_ab radius=dlina_ac/math.sin(ugol_d/2) d=a+radius*math.cos(ugol_ad)+radius*math.sin(ugol_ad)*1j tochka_imj_ev(d,"d",8) otrezok (a,d) otrezok (b,d) otrezok (c,d) obj = iDocument2D.ksCircle(d.real,d.imag, radius, 2) obj = iDocument2D.ksArcByPoint(d.real,d.imag, radius, a.real, a.imag, b.real,b.imag, -1, 1) dlina_dugi=radius*ugol_d return dlina_dugi a=111+222*1j b=333+333*1j ugol_d=math.radians(138.2) dlina=dlina_dugi (a,b,ugol_d) print "dlina_dugi",dlina a=511+222*1j b=733+333*1j ugol_d=math.radians(68.2) dlina=dlina_dugi (a,b,ugol_d) print "dlina_dugi",dlina 

Kód obsahuje funkci a dvě její volání.

Trochu více informací na webu:

Dám také celý kód makra Compass:

### coding: cp1251 ### 2D-API|step3a #ug1=(cmath.polar(b-a)[1]) import math import cmath import Kompas10API5 as KAPI import Kompas10API7 as KAPI7 import pythoncom from win32com.client import Dispatch import LDefin2D import LDefin3D import ksConstants as CONST2D7 import ksConstants3D as CONST3D7 import MiscellaneousHelpers as MH x = 22222 formula='x+1' print eval(formula) try: Kompas print "yes Kompas:" except Exception: print "no Kompas:" import Kompas6API5, LDefin3D, LDefin2D Kompas, doc3d = start3d() iKompasObject = Dispatch('KOMPAS.Application.5') iKompasObject = KAPI.KompasObject(iKompasObject) MH.iKompasObject = iKompasObject iApplication = Dispatch('KOMPAS.Application.7') iApplication = KAPI7.IApplication(iApplication) MH.iApplication = iApplication iDocument2D = iKompasObject.Document2D() iDocumentParam = KAPI.ksDocumentParam(iKompasObject.GetParamStruct(LDefin2D.ko_DocumentParam)) iDocumentParam.Init() iDocumentParam.type = LDefin2D.lt_DocFragment iDocument2D.ksCreateDocument(iDocumentParam) # massivi uglov prjmich ugol_prjmoj=[] ugol_prjmoj_2=[] # massiv prjmich spisok=[] spisok_2=[] spisok_3=[] spisok_3=0 spisok_3=[] rezult=[] nom_spis=0 nom_spis_3=0 nom_spis_3=0 shag=300 diametr=2100 shir_stup=1500 kolich_prjmich_stupenej=5 visota_stupeni=70 tolchina_materiala=4 zazor_m_s=visota_stupeni-tolchina_materiala razmah_gor=diametr+shir_stup/2 # stupenki s 5 uglov ug90_1=math.pi/4-0.1 ug90_2=math.pi*3/4 # Kolichestvo zabegnich celoe chetnoe kolich_zabegnich=math.floor(0.5*math.pi*diametr/shag) shag=0.5*math.pi*diametr/kolich_zabegnich #+++++++++++++++++++++++++++++++++++++++++++++++++++++++____________________________________________________________________________________________ def ugol_otrezka(a,b): ug1=(cmath.polar(b-a)[1]) return ug1 def tochka(a,nomer): x=a.real y=a.imag iDocument2D.ksPoint(x, y, nomer) def tochka_imj(a,nomer): x=a.real y=a.imag def bar(var): for k, v in globals().items(): if id(var) == id(a): # print a,v if a==v: rez=k return rez rez= bar (a) iDocument2D.ksPoint(x, y, nomer) tekst (a+7+22*1j,rez) def otrezok_na_rast(a,b,c,d,rast): ### na rasstojnii b peresechenie so storonami ### ugol_ab=ugol_otrezka(a,b) ugol_ac=ugol_otrezka(a,c) t90_a=a-rast*math.sin(ugol_ab)+rast*math.cos(ugol_ab)*1j ugol_treug=ugol_ac-(ugol_ab+math.pi/2) dlina_dobavki=rast*math.tan(ugol_treug) a_rast=t90_a-dlina_dobavki*math.cos(ugol_ab)-dlina_dobavki*math.sin(ugol_ab)*1j tochka (a_rast) return a_rast def prjmaj(koor=0+0*1j,ugol=0): x1=1.0*koor.real y1=1.0*koor.imag iDocument2D.ksLine(x1, y1, math.degrees(ugol)) def otrezok(a,b,oboznachenie=False): """ """ x1=1.0*a.real y1=1.0*a.imag x2=1.0*b.real y2=1.0*b.imag #If Doc.ksExistObj(L12)=1 then Doc.ksDeleteObj(L12); #IApplication::ExecuteKompasCommand( ksCMEditClear, FALSE|TRUE )? obj1 = iDocument2D.ksLineSeg(x1,y1,x2,y2, 1) obj2 = iDocument2D.ksLineSeg(x1+111,y1,x2+111,y2, 2) iDocument2D.ksDeleteObj(obj2) if oboznachenie== True: tochka_imj (a,5) tochka_imj (b,5) ttt=100+100*1j iii("ttt",7) else: a=a def massiv_po_okrug (koor_tochka1,koor_tochka2,ugol,kolich): a1=koor_tochka1 b1=koor_tochka2 ugoltmp=math.radians(ugol) jjj=math.sqrt(1.0-math.sin(ugoltmp)*math.sin(ugoltmp)) mn_nov=jjj+math.sin(ugoltmp)*1j a11=a1 b11=b1 otrezok (a1+sm,b1+sm) prjmaj (koor=a1+sm,ugol=ugol_otrezka(a1+sm,b1+sm)) for nom in iter(range(kolich)): a22=(a11)*(mn_nov) b22=(b11)*(mn_nov) s=abs((a11+b11)/2-(a22+b22)/2) a11=a22 b11=b22 otrezok (a22+sm,b22+sm) prjmaj (koor=a22+sm,ugol=ugol_otrezka(a22+sm,b22+sm)) spisok_3.append(a22+sm) spisok_3.append(b22+sm) spisok_3.append("n") rezult =[] rezult.append(a22+sm) rezult.append(b22+sm) return rezult def massiv_po_okrug_obj (koor_tochka1,koor_tochka2,ugol,kolich): a1=koor_tochka1 b1=koor_tochka2 ugoltmp=math.radians(ugol) jjj=math.sqrt(1.0-math.sin(ugoltmp)*math.sin(ugoltmp)) mn_nov=jjj+math.sin(ugoltmp)*1j a11=a1 b11=b1 otrezok (a1+sm,b1+sm) # prjmaj (koor=a1+sm,ugol=ugol_otrezka(a1+sm,b1+sm)) for nom in iter(range(kolich)): a22=(a11)*(mn_nov) b22=(b11)*(mn_nov) s=abs((a11+b11)/2-(a22+b22)/2) a11=a22 b11=b22 otrezok (a22+sm,b22+sm) # prjmaj (koor=a22+sm,ugol=ugol_otrezka(a22+sm,b22+sm)) spisok_3.append(a22+sm) spisok_3.append(b22+sm) spisok_3.append("n") rezult =[] rezult.append(a22+sm) rezult.append(b22+sm) return rezult def na_rast_paral (kolich,a1,b1,s111): ug=ugol_otrezka (a1,b1) for nom in iter(range(kolich)): ap=a1+(nom+1)*s111*math.cos(ug-math.pi/2)+(nom+1)*s111*math.sin(ug-math.pi/2)*1j bp=b1+(nom+1)*s111*math.cos(ug-math.pi/2)+(nom+1)*s111*math.sin(ug-math.pi/2)*1j otrezok(ap,bp) spisok_3.append(ap) spisok_3.append(bp) spisok_3.append("n") def na_rast_paral_bezl (kolich,a1,b1,s222): global ap global bp ug=ugol_otrezka (a1,b1) ap=a1+s222*math.cos(ug-math.pi/2)+s222*math.sin(ug-math.pi/2)*1j bp=b1+s222*math.cos(ug-math.pi/2)+s222*math.sin(ug-math.pi/2)*1j def tekst(k,inf): x=k.real y=k.imag iParagraphParam = KAPI.ksParagraphParam(iKompasObject.GetParamStruct(LDefin2D.ko_ParagraphParam)) iParagraphParam.Init() iParagraphParam.x = x iParagraphParam.y = y iParagraphParam.ang = 0.0 iParagraphParam.height = 7.13581323623 iParagraphParam.width = 10.55124855041 iParagraphParam.hFormat = 0 iParagraphParam.vFormat = 0 iParagraphParam.style = 1 iDocument2D.ksParagraph(iParagraphParam) iTextLineParam = KAPI.ksTextLineParam(iKompasObject.GetParamStruct(LDefin2D.ko_TextLineParam)) iTextLineParam.Init() iTextLineParam.style = 1 iTextItemArray = KAPI.ksDynamicArray(iKompasObject.GetDynamicArray(4)) iTextItemParam = KAPI.ksTextItemParam(iKompasObject.GetParamStruct(LDefin2D.ko_TextItemParam)) iTextItemParam.Init() iTextItemParam.iSNumb = 0 iTextItemParam.s = inf iTextItemParam.type = 0 iTextItemFontParam = KAPI.ksTextItemFont(iTextItemParam.GetItemFont()) iTextItemFontParam.Init() iTextItemFontParam.bitVector = 4096 iTextItemFontParam.color = 0 iTextItemFontParam.fontName = "GOST type A" iTextItemFontParam.height = 20.0 iTextItemFontParam.ksu = 1.0 iTextItemArray.ksAddArrayItem(-1, iTextItemParam) iTextLineParam.SetTextItemArr(iTextItemArray) iDocument2D.ksTextLine(iTextLineParam) obj = iDocument2D.ksEndObj() def tochka_imj_ev(tp,im,nomer): # print tp,im,nomer # eval(funkk) tochka (tp,nomer) tekst (tp+7+22*1j,im) def tochka_imj_eva(tp,funkk): print tp,funkk eval(funkk) # tochka (tp,nomer) tekst (tp,"rez") def iii(im,nomer): print "im,nomer",im,nomer def peresechrnie_otrezkov(a,b,c,d,oboznachenie=False): """ a,b,c,d -koordinati obo=False - bez imeni tochki """ otrezok (a,b) otrezok (c,d) ug_ba=((cmath.polar((b-a))[1])) ug_dc=((cmath.polar((d-c))[1])) ug_ba_tan=math.tan(ug_ba) ug_dc_tan=math.tan(ug_dc) k1=ug_ba_tan k2=ug_dc_tan # po osi y otsekaet b1=a.imag-k1*a.real b2=c.imag-k2*c.real bb1=a-(a)*k1 xtp=(b2-b1)/(k1-k2) ytp=k1*xtp + b1 tp=xtp+ytp*1j ##x = 22222 ## ##formula='x+1' ##print eval(formula) # tochka_imj_eva("tp",7) # funk='tochka (tp,3)' # eval(funk) # tochka (tp,3) # tp1=tp ##################################### tochka_imj_eva (tp,"tochka (tp,7)") if oboznachenie== True: # tochka_imj_ev (tp,"tp",7) tochka (tp,7) tochka_imj (a,5) tochka_imj (b,5) tochka_imj (c,5) tochka_imj (d,5) # tochka_imj (a,5) # tochka_imj (b,5) # tochka_imj (c,5) # tochka_imj (d,5) ttt=100+100*1j iii("ttt",7) else: a=a # tochka (tp,7) # tochka (a,5) # tochka (b,5) # tochka (c,5) # tochka (d,5) a1=1863.5491+ 1512.5341*1.0j b1=3109.8835+2252.2591*1.0j # Programma Programma Programma Programma Programma Programma Programma Programma # Programma Programma Programma Programma Programma Programma Programma Programma # Programma Programma Programma Programma Programma Programma Programma Programma # Programma Programma Programma Programma Programma Programma Programma Programma # Programma Programma Programma Programma Programma Programma Programma Programma # Programma Programma Programma Programma Programma Programma Programma Programma # Programma Programma Programma Programma Programma Programma Programma Programma def dlina_dugi(a,b,ugol_d): otrezok (a,b) c=(a+b)/2 tochka_imj (a,5) tochka_imj (b,5) tochka_imj_ev (c,"c",2) ugol_ab=(cmath.polar(b-a)[1]) dlina_ac=0.5*abs(b-a) ugol_ac_ad=(math.pi)/2-(ugol_d)/2 ugol_ad=-ugol_ac_ad+ugol_ab radius=dlina_ac/math.sin(ugol_d/2) d=a+radius*math.cos(ugol_ad)+radius*math.sin(ugol_ad)*1j tochka_imj_ev(d,"d",8) otrezok (a,d) otrezok (b,d) otrezok (c,d) obj = iDocument2D.ksCircle(d.real,d.imag, radius, 2) obj = iDocument2D.ksArcByPoint(d.real,d.imag, radius, a.real, a.imag, b.real,b.imag, -1, 1) dlina_dugi=radius*ugol_d return dlina_dugi a=111+222*1j b=333+333*1j ugol_d=math.radians(138.2) dlina=dlina_dugi (a,b,ugol_d) print "dlina_dugi",dlina a=511+222*1j b=733+333*1j ugol_d=math.radians(68.2) dlina=dlina_dugi (a,b,ugol_d) print "dlina_dugi",dlina 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Back to top button