Комплексные числа в 2D графике

Автор Vitalij Lysanov, 30.06.15, 00:11:15

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Vitalij Lysanov


Точка  a=x1+y1*j,         точка  b=x2+y2*j
Линия "otrezok (a,b)"

"otrezok" это имя функции, которая переводит в стандартный формат. 
def otrezok(a,b):
    x1=a.real
    y1=a.imag
    x2=b.real
    y2=b.imag
    obj1 = iDocument2D.ksLineSeg(x1,y1,x2,y2, 1)

Пример эскиза прямоугольника.
iDocument2D = iDefinition.BeginEdit()
    otrezok (a,b)
    otrezok (c,d)
    otrezok (a,c)
    otrezok (b,d)
    iDefinition.EndEdit()


Форма записи приближается к форме учебника геометрии.
Собственно, например, при повороте лестницы, ступени получаются в виде четырехугольника общего вида.
Ступенька выступает за опору на несколько сантиметров, и хотелось, чтобы края опоры повторяли линии ступени. 
Получаем следующую функцию:
def otrezok_na_rast(a,b,c,d,rast):
     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 ugol_otrezka(a,b):
    ug1=(cmath.polar(b-a)[1])
    return ug1



В примере строится лестница в 2D.
Эскизы  передаются в 3D для построения лестницы.
Макрос запускается с чистой детали из режима редактирования.

С уважением,

Виталий



Vitalij Lysanov

Пример применения комплексных чисел при расчете лестницы


     Изогнутые лестницы обладают большей прочностью.
Облегчить расчет помогут комплексные числа. 

    По заданному углу между ступенями рассчитывается комплексный множитель поворота исходного отрезка

    ugol=math.radians(ugol)
    jjj=math.sqrt(1.0-math.sin(ugol)*math.sin(ugol))
    mn_nov=jjj+math.sin(ugol)*1j

    Макрос работает на чистой детали из режима редактирования. 

   С уважением,

   Виталий

Vitalij Lysanov

Еще пример по данным темы
https://forum.ascon.ru/index.php/topic,32320.msg262500/topicseen.html#msg262500

Код работает на Portable Python 3.2

  if __name__ == "__main__":



    import cmath
    import math

    a=complex(0,0)                      # Точка ступени лестицы
    текст(a,"a")                        # Текст возле точки
    точка(a,5)                          # Обозначение точки



    b2=complex(22,0)
    текст(b2,"b2")
    точка(b2,5)



    c2=complex(22,-15)
    текст(c2,"c2")
    точка(c2,5)


    b=b2*0.8                            # Новая точка рассчетного треугольника в процентах от b2
    текст(b,"b")
    точка(b,5)


    ug_alf=-25                          #  Угол который слева


    угол=15                             #   угол в маленьком треугьнике

    прямая(b,90)                        #  вертикальная прямая из точки b

    pr1=прямая(a,ug_alf)                # Прямые длдя постороения новой точки
    pr2=прямая(b,-угол-90)

    c=пересечение_прямых(pr1, pr2)      # Пересечение прямых
    текст(c,"c")



    for n in range(10):                 # Рисуем еще ступени


        отрезок(a-n*c2,b2-n*c2)
        отрезок(b2-n*c2,c2-n*c2)

   


Насколько понял.

Ступени a-b2  и и b2-c2
Новая точка b как часть b2

Из точки b под углом проводим прямую которая должна пересечь другую прямую
Из точки a под другим углом проводим другую прямую

Ищем точку пересечения

 


Sprinter500

Цитата: Vitalij Lysanov от 30.06.15, 00:11:15
Точка  a=x1+y1*j,         точка  b=x2+y2*j
Линия "otrezok (a,b)"

"otrezok" это имя функции, которая переводит в стандартный формат. 
def otrezok(a,b):
    x1=a.real
    y1=a.imag
    x2=b.real
    y2=b.imag
    obj1 = iDocument2D.ksLineSeg(x1,y1,x2,y2, 1)

Пример эскиза прямоугольника.
iDocument2D = iDefinition.BeginEdit()
    otrezok (a,b)
    otrezok (c,d)
    otrezok (a,c)
    otrezok (b,d)
    iDefinition.EndEdit()


Форма записи приближается к форме учебника геометрии.
Собственно, например, при повороте лестницы, ступени получаются в виде четырехугольника общего вида.
Ступенька выступает за опору на несколько сантиметров, и хотелось, чтобы края опоры повторяли линии ступени. 
Получаем следующую функцию:
def otrezok_na_rast(a,b,c,d,rast):
     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 ugol_otrezka(a,b):
    ug1=(cmath.polar(b-a)[1])
    return ug1



В примере строится лестница в 2D.
Эскизы  передаются в 3D для построения лестницы.
Макрос запускается с чистой детали из режима редактирования.

С уважением,

Виталий



Не боитесь, что из-за несовпадения центров пересечения ступенек и самой спиральной лестницы люди будут спотыкаться, так как ступеньки отличаются одна от другой?

Vitalij Lysanov

Цитата: Sprinter500 от 22.04.19, 14:49:30


Не боитесь, что из-за несовпадения центров пересечения ступенек и самой спиральной лестницы люди будут спотыкаться, так как ступеньки отличаются одна от другой?

Да действительно с масштабированием исходных данных всегда могут быть проблемы. Поэтому от конкретных чисел стараются уходить.

Например если сказать так. Плоский фронт отражается от цилиндрической поверхности. И аналогичную кривую всегда можно повторить при любом масштабе.

Правда это нужно еще  таких друзей поискать, чтобы через щель в минус девятой не смогли перепрыгнуть.


YNA

А вот было бы неплохо в 3Д. Например комплексная поверхность описывается уравнением Z=mod(x; jy). То есть по оси Z откладывается модуль комплексного числа z=x+jy.
Простой пример, чисто интуитивный, для числа x+jy поверхность будет представлять собой сначала четырёхлепестковый цветок, вырождающийся в гиперболоид вращения, хотя это только интуитивная догадка. Очень интересная поверхность у функции EXP(1/z), где z=x+jy в окрестностях точек (-1; 0; 1).
Компас сейчас строит только кривые по закону. Можно конечно построить группу кривых или точек и потом преобразовать в поверхность, но делать это в рукопашную очень трудоёмко, а вот со специальной программкой (назовём её Поверхность По Закону) это было бы чудненько. :)

Vitalij Lysanov

#6
Если нужно больше измерений, то это вектора Numpy, например цвет точки в пространстве.

Компас может строить поверхность по регулярным массивам точек, массив до 200 000 точек.
https://forum.ascon.ru/index.php/topic,10204.msg223224.html#msg223224   №34. 

Из точек соседних линий можно STL формат получить
https://forum.ascon.ru/index.php/topic,29181.msg223673.html#msg223673
Это до 1000 треугольников
Есть еще формирование STL из программы
https://docs.google.com/document/d/165jHZZuPNVuarNWW76fVL1viZ37gr-Q1jvR0zzPT2Hs/edit




Кроме массива точек много информации Компас с программы не берет. Это можно прямой записью в формат STEP и затем в Компас.

Про прямую запись в. формат STEP
https://forum.ascon.ru/index.php/topic,32252.msg261761.html#msg261761



В VTK можно много точек ввести и они не просвечиваются через поверхности. Например математическая поверхность и точки с 3D сканера и становится немного понятней что за точки.  Зеленая и красная полоски это все точки.






Поверхности очень затратная процедура, это их нужно отдельно загрузить, выбрать часть или что то с ней сделать и потом загрузить в Компас для работы.



___

Numpy-Stl немного сложно ставить, промежуточные приходится доставлять.


Пробовал по методике и без нейро сетей
https://habr.com/ru/post/448316/

VTK тоже можно поставить, только VTK все разные, картинку которая выше не все VTK рисуют, как раз новые и не рисуют.
Картинку рисует VTK который в Python  XY с Python 2.6. Это можно вначале Python XY поставить, затем например Компас 14. И все  вместе будет работать. 




Это зашел в аккаунт на любой машине включил и нарисовало, правда кукисы требует в доступ.
Там и видеокарта есть готовая.

И особо не подсаживают, все можно установить и на отдельной машине,

Переставляли машину, зашел в аккаунт, включил и нарисовало
Код, только тут еще немного от нейро осталось
    from google.colab import drive
drive.mount('/content/drive/')










import datetime as dt
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from tqdm import tqdm
import cv2
import numpy as np
import os
import sys
import random
import warnings
from sklearn.model_selection import train_test_split

import keras

from keras import backend as K
from keras import regularizers
from keras.models import Sequential
from keras.models import Model
from keras.layers import Dense, Dropout, Activation
from keras.layers import Flatten, Conv2D
from keras.layers import MaxPooling2D
from keras.layers import BatchNormalization, Input
from keras.layers import Dropout, GlobalAveragePooling2D
from keras.callbacks import Callback, EarlyStopping
from keras.callbacks import ReduceLROnPlateau
from keras.callbacks import ModelCheckpoint
import shutil
from keras.applications.vgg16 import preprocess_input
from keras.preprocessing import image
from keras.preprocessing.image import ImageDataGenerator

from keras.models import load_model

from keras.applications.resnet50 import ResNet50
from keras.applications.resnet50 import preprocess_input
from keras.applications.resnet50 import decode_predictions

from keras.applications import inception_v3
from keras.applications.inception_v3 import InceptionV3
from keras.applications.inception_v3 import preprocess_input as inception_v3_preprocessor

from keras.applications.mobilenetv2 import MobileNetV2

from keras.applications.nasnet import NASNetMobile










working_path = "/content/drive/My Drive/17apr/"
!ls "/content/drive/My Drive/17apr"



# Is GPU Working?   просмотр нотебук инфо      модифи ноотебук сеттинг GPU
import tensorflow as tf
tf.test.gpu_device_name()



fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()












pip install numpy-stl






   #  -*- coding: cp1251 -*-

import math
import copy
import numpy as np

from stl import mesh
from mpl_toolkits import mplot3d
from matplotlib import pyplot

cube = mesh.Mesh(np.zeros(27115, dtype=mesh.Mesh.dtype))


r=np.arange(0, 10, 0.001)
r=11+68*(abs(np.sin((r+1)*3)))

r=np.array(r)
r[1600:1700]=86
r[1640:1670]=86-1

rk=copy.copy(r)

f2 = open(working_path+'tochk13.txt', "w")
m=[]
ma1=np.zeros((5000, 10000))
shag=1

pl=68+5
vdal=55
rast=np.zeros(len(r))

for n in range (len(r)):
   sm=0
   u=6.28*(n/len(r))       
   us=u-1.039               
   rp=0


   og=11111
   if math.cos(us)>0.1: og=pl/math.cos(us)
   rast[n]=og


for pr in range(0,vdal,shag):
    rk=copy.copy(r)

    rk[r<rast]=0
    ma1[pr,:]=rk[:]


    for n in range(1):     
        b = r[0]
        for i in range(len(r)-1):
           r[i] = r[i+1]
        r[len(r)-1] = b

m=ma1
xma=[]
yma=[]
zma=[]

h=20
sdv=20
for nak in range(1):
    m[0:h, : : ]=np.maximum(m[0:h, : : ],m[sdv+nak:sdv+nak+h, : : ])
nt=0
for pr in range(vdal-1):
    for n in range(len(r)):
        if m[pr,n]>1:
            #print (n)
           
           
           
            smx=-40
            smy=-140
            smz=-70
           
           
            if n>1500 and n<1700:
                nt=nt+1
                cube.vectors[nt][1]= np.array([pr+smx,     smy+n/10,         smz+  m[pr,n]])
                cube.vectors[nt][0]= np.array([pr+smx,   smy+(n+1)/10,       smz+  m[pr+1,n]])
                cube.vectors[nt][2]= np.array([pr+1+smx,     smy+(n+1)/10,     smz+  m[pr,n+1]])
             
                nt=nt+1
                cube.vectors[nt][0]= np.array([pr+1+smx,     smy+(n)/10,         smz+  m[pr,n]])
                cube.vectors[nt][1]= np.array([pr+1+smx,   smy+(n+1)/10,         smz+  m[pr,n]])
                cube.vectors[nt][2]= np.array([pr+smx,   smy+(n)/10,     smz+  m[pr+1,n+1]])
             
           
            f2.write(str(-pr))
            f2.write (         "\t")

            f2.write     (     str(n/20)   )
            f2.write("\t")

            f2.write   (     str(  m[pr,n]     )  )
            f2.write("\t")

            f2.write("\n")
    f2.write("\n")

f2.close()

print ("_000__")



import numpy as np
from stl import mesh

import stl
from mpl_toolkits import mplot3d
from matplotlib import pyplot
#
# Create a new plot
figure = pyplot.figure()
axes = mplot3d.Axes3D(figure)


cube.rotate([0,0,1],np.deg2rad(-86))
cube.rotate([1,0,0],np.deg2rad(68))

your_mesh = cube

axes.add_collection3d(mplot3d.art3d.Poly3DCollection(your_mesh.vectors))

## Auto scale to the mesh size
scale = your_mesh.points.flatten(2)
#
axes.auto_scale_xyz(scale, scale, scale)
#
## Show the plot to the screen
pyplot.show()

# Write the mesh to file "cube.stl"


print ("_1__")
cube.save(working_path+'cube.stl')

print ("_2__")











   





Код для VTK

 

#!/usr/bin/env python

import vtk

# Create the geometry of a point (the coordinate)
points = vtk.vtkPoints()


# Create the topology of the point (a vertex)
vertices = vtk.vtkCellArray()
vertices1 = vtk.vtkCellArray()


import math


raz=76000
m=2400

#1 1 1 1 1 1 1 1 11 1 1 1 1 1 11 1 1 1 1 11  1 1 1 1 11111111111111111111111111111111111111111111111
for ii in range(raz):
    i=ii/1200.0
    x=m*math.sin(i)+1
    y=m*math.cos(i)
    z=m*i/1000.0
    id = points.InsertNextPoint([x,y,z])
    vertices.InsertNextCell(1)
    vertices.InsertCellPoint(id)


# Create a polydata object
point = vtk.vtkPolyData()
# Set the points and vertices we created as the geometry and topology of the polydata
point.SetPoints(points)
point.SetVerts(vertices)

# Visualize
mapper = vtk.vtkPolyDataMapper()
mapper.SetInput(point)



actor1 = vtk.vtkActor()

actor1.SetMapper(mapper)
#actor.GetProperty().SetPointSize(1)
actor1.GetProperty().SetColor(1,0,0) # (R,G,B)
actor1.SetMapper(mapper)


actor1.SetScale ( 2.01 , 1.01 , 1.01 )

#11111111111111111111111111111111111111111111111111111111111111111111111111





#2 2 22 22 22 22 222 222 22 22 222 22 22 222 222222
for ii in range(raz):
    i=ii/100.0
    x=m*math.sin(i)
    y=m*math.cos(i)
    z=m*i/1000.0
    id = points.InsertNextPoint([x,y,z])
    vertices1.InsertNextCell(1)
    vertices1.InsertCellPoint(id)







# Create a polydata object
point1 = vtk.vtkPolyData()

# Set the points and vertices we created as the geometry and topology of the polydata
point1.SetPoints(points)
point1.SetVerts(vertices1)

# Visualize
mapper1 = vtk.vtkPolyDataMapper()
mapper1.SetInput(point1)


actor2 = vtk.vtkActor()
actor2.SetMapper(mapper1)
#actor1.GetProperty().SetPointSize(1)
actor2.GetProperty().SetColor(0,1,0) # (R,G,B)
actor2.SetMapper(mapper1)
#22222222222222222222222222222222222222222222222222222222222222222222


shag=47

# 3 3 3 3 33
appendFilter = vtk.vtkAppendPolyData()

import math
r=4222
input1 = vtk.vtkPolyData()
sphereSource = vtk.vtkSphereSource()

for u100 in range(0,628*1,shag):
    u=u100/100.0
    u_gr=math.degrees(u)
    print u_gr
    x=r*math.sin(u)
    y=r*math.cos(u)

    input1.ShallowCopy(sphereSource.GetOutput())
    appendFilter.AddInputConnection(input1.GetProducerPort())

    input1 = vtk.vtkPolyData()
    sphereSource = vtk.vtkSphereSource()
    sphereSource.SetRadius(u*200)
    sphereSource.SetCenter(x,y,0)


#    sphereSource.SetStartPhi(0)
#    sphereSource.SetEndPhi(270)
#    sphereSource.SetStartTheta(u_gr)
#    sphereSource.SetEndTheta(u_gr-180)
    sphereSource.SetStartTheta(0)
    sphereSource.SetEndTheta(180)
   




    sphereSource.Update()
   
    input1.ShallowCopy(sphereSource.GetOutput())
    appendFilter.AddInputConnection(input1.GetProducerPort())


appendFilter.Update()


### Create a mapper and actor
mapper = vtk.vtkPolyDataMapper()
#mapper.SetInputConnection(cleanFilter.GetOutputPort())
mapper.SetInputConnection(appendFilter.GetOutputPort())
appendFilter


actor3 = vtk.vtkActor()
actor3.SetMapper(mapper)

# color the actor
actor3.GetProperty().SetColor(1,0,0) # (R,G,B)

#33333333333333333333


















# 4444444444444444443 3 3 3 33

appendFilter = vtk.vtkAppendPolyData()

import math
r=4222
input1 = vtk.vtkPolyData()
sphereSource = vtk.vtkSphereSource()

for u100 in range(0,628*1,shag):
    u=u100/100.0
    x=-r*math.sin(u)
    y=-r*math.cos(u)


#111111111111111111111111111111111111111111111111111111111111
   
    input1.ShallowCopy(sphereSource.GetOutput())
    appendFilter.AddInputConnection(input1.GetProducerPort())

    input1 = vtk.vtkPolyData()
    sphereSource = vtk.vtkSphereSource()
    sphereSource.SetRadius(u*200)
    sphereSource.SetCenter(x,y,0)
    sphereSource.SetStartTheta(0)
    sphereSource.SetEndTheta(180)



    sphereSource.Update()
   
    input1.ShallowCopy(sphereSource.GetOutput())
    appendFilter.AddInputConnection(input1.GetProducerPort())


appendFilter.Update()


### Create a mapper and actor
mapper = vtk.vtkPolyDataMapper()
#mapper.SetInputConnection(cleanFilter.GetOutputPort())
mapper.SetInputConnection(appendFilter.GetOutputPort())
appendFilter


actor4 = vtk.vtkActor()
actor4.SetMapper(mapper)
# color the actor
actor4.GetProperty().SetColor(1,1,1) # (R,G,B)



#44444444444444443333333333333333333



actor1.GetProperty().SetColor(1,0,0) # (R,G,B)
actor2.GetProperty().SetColor(0,1,0) # (R,G,B)
actor3.GetProperty().SetColor(0,0,1) # (R,G,B)
actor4.GetProperty().SetColor(1,1,1) # (R,G,B)




#Create a renderer, render window, and interactor
renderer = vtk.vtkRenderer()
renderWindow = vtk.vtkRenderWindow()
renderWindow.SetSize ( 1800 , 1000 )

renderWindow.AddRenderer(renderer)


renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)



renderer.AddActor(actor1)
renderer.AddActor(actor2)
renderer.AddActor(actor3)
renderer.AddActor(actor4)
#renderer.GetActiveCamera().ParallelProjectionOn()
#renderer.GetActiveCamera().ParallelProjectionOff()





renderWindow.Render()
renderWindowInteractor.Start()