Não é tão comum mas as vezes encontradas em praças como caminho de pedestres ou espelho de água de um chafariz
Como funciona?
Partindo do centro até uma das pontas desenhe uma linha com apenas dois nós
Escolha o número de pontas
Demonstração
Imagem.gif, clique para visualizar.
Código
fromorg.openstreetmap.josm.guiimportMainApplication,Notificationfromorg.openstreetmap.josm.data.osmimportWay,Nodefromorg.openstreetmap.josm.data.coorimportLatLonfromorg.openstreetmap.josm.commandimportAddCommand,DeleteCommand,SequenceCommandfromorg.openstreetmap.josm.data.UndoRedoHandlerimportgetInstancefromjavax.swingimportJOptionPane,JPanel,JLabel,JSpinner,SpinnerNumberModel,UIManagerfromjava.awtimportGridBagLayout,GridBagConstraints,Insets,Dimensionfromjava.utilimportLinkedListimportmathdefcriar_estrela_nodes(cx,cy,raio_externo,num_pontas,angulo_rotacao):angulo_base=2*math.pi/(num_pontas*2)coords=[]foriinrange(num_pontas*2):angulo=i*angulo_baseraio=raio_externoifi%2==0elseraio_externo/2.5dx=raio*math.cos(angulo)dy=raio*math.sin(angulo)# Aplica rotacaodx_rot=dx*math.cos(angulo_rotacao)-dy*math.sin(angulo_rotacao)dy_rot=dx*math.sin(angulo_rotacao)+dy*math.cos(angulo_rotacao)dlat=dy_rot/111320.0dlon=dx_rot/(111320.0*math.cos(math.radians(cx)))lat=cx+dlatlon=cy+dloncoords.append((lat,lon))returncoordsdefexecutar():layer=MainApplication.getLayerManager().getEditLayer()iflayerisNone:Notification(u"Nenhuma camada de edição ativa.")\
.setIcon(UIManager.getIcon("OptionPane.errorIcon"))\
.show()returndataset=layer.dataselecionados=dataset.getSelected()ways=[xforxinselecionadosifisinstance(x,Way)]iflen(ways)!=1:Notification(u"Selecione uma linha com dois nós.")\
.setIcon(UIManager.getIcon("OptionPane.informationIcon"))\
.show()returnlinha=ways[0]iflen(linha.getNodes())!=2:Notification(u"A linha deve conter exatamente dois nós.")\
.setIcon(UIManager.getIcon("OptionPane.informationIcon"))\
.show()returncentro=linha.getNodes()[0]ponta=linha.getNodes()[1]cx=centro.getCoor().lat()cy=centro.getCoor().lon()px=ponta.getCoor().lat()py=ponta.getCoor().lon()dx=(py-cy)*111320*math.cos(math.radians((cx+px)/2))dy=(px-cx)*111320raio=math.hypot(dx,dy)# Calcular angulo de orientacao da linhadelta_x=(py-cy)*math.cos(math.radians((cx+px)/2))delta_y=(px-cx)angulo_rot=math.atan2(delta_y,delta_x)# Caixa de dialogopanel=JPanel()panel.setLayout(GridBagLayout())c=GridBagConstraints()c.insets=Insets(5,5,5,5)c.gridx=0c.gridy=0c.anchor=GridBagConstraints.EASTpanel.add(JLabel(u"Número de pontas:"),c)c.gridx=1spinner_model=SpinnerNumberModel(5,3,25,1)spinner=JSpinner(spinner_model)spinner.setPreferredSize(Dimension(80,25))panel.add(spinner,c)resultado=JOptionPane.showConfirmDialog(None,panel,"Criar Estrela",JOptionPane.OK_CANCEL_OPTION)ifresultado!=JOptionPane.OK_OPTION:returnnum_pontas=spinner.getValue()coords=criar_estrela_nodes(cx,cy,raio,num_pontas,angulo_rot)comandos=[]novos_nos=[]forlat,lonincoords:n=Node(LatLon(lat,lon))comandos.append(AddCommand(dataset,n))novos_nos.append(n)# Fechar a estrela com o primeiro nonovos_nos.append(novos_nos[0])estrela=Way()estrela.setNodes(LinkedList(novos_nos))comandos.append(AddCommand(dataset,estrela))# Remover a linha original e seus dois noscomandos.append(DeleteCommand(dataset,linha))comandos.append(DeleteCommand(dataset,linha.getNodes()))getInstance().add(SequenceCommand("Criar estrela",comandos))Notification("Estrela criada com sucesso.")\
.setIcon(UIManager.getIcon("OptionPane.informationIcon"))\
.show()executar()