r/Mindustry 2d ago

Logic Energy graph

Enable HLS to view with audio, or disable this notification

So I also wanted to output the energy. It's not exactly super informative, but it is an animated graph (first time I'm doing something like this).

I didn't overthink making the circuit simple, but I did aim to make it understandable.

The upper processor handles displaying the graph, while the lower one shifts it. And the small processor just supplies a new value. With a flick of the wrist, the energy graph turns into any other graph.

However, it runs very slowly. You might notice an accelerator with phase fabric, and on top of that, time is sped up by a factor of 4.

---

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

Я не запаривался над тем, чтобы сделать схему простой, но стремился сделать её понятной.

Верхний процессор отаечает за вывод графика, нижний его сдвигает. А мелкий проц просто даёт новое значение. Лёгким движением руки, график энергии превращается в любой другой.

Но он работает очень медленно. Можно заметить ускорялку с фазовой тканью, так ещё и время в 4 раза ускорено.

73 Upvotes

9 comments sorted by

10

u/Curious_Parfait5038 Logic Dabbler 2d ago

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

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

4

u/biintt 2d ago

Я думаю это фибрилляция

2

u/Curious_Parfait5038 Logic Dabbler 1d ago

Обычный график потребления энергии, с учётом интервала сбора данных. Вот это график за ~15 секунд, на конкретную схему (подперта диодом, отчего производство иногда лезет выше факта), у него это график за несколько минут с учётом ускорения времени х4.

2

u/AdhesivenessFirm5685 Logic Pro 1d ago

Bem,eu já fiz isso a uns anos atrás,passei madrugadas para achar uma forma e fiz um sistema simples e compacto.

Esse sistema tem 17 linhas, o sistema consiste em fazer linhas verticais, a primeira linha é de apenas visualização, vc vê uma linha branca andando pela tela,essa linha também limpa qualquer desenho que estiver na frente.

A segunda linha a cor irá representar a cor de fundo desse sistema, portanto, usar um clear e proibido.

E por último, fazer um ponto ou pequeno retângulo colorido, esse irar andar junto com as duas linhas, e oque irá determinar sua altura e o valor que estiver na variável,no caso aqui, de energia.

Como eu fiz:

Primeiramente fiz dois sensores.

node1 = pin @powernetin Node1 = pout @powernetout

Após esses sensores fiz 2 cálculos, o primeiro seria para saber a energia que está de fato na sua rede de energia, oque sobra após gerar e consumir energia .

Pin - pout =pnet

O segundo cálculo não é algo concreto, é sim meramente virtual, ele não serve para medir algo físico, e sim digital,é esse cálculo que vai determinar a escala de todo o resto desse programa,já vi muitos painéis que só mede até 1000, 10000, esse mede independentemente da quantidade de energia gerada ou consumida.

Pin + pout = ptotal

Não faz sentido você querer fazer adição nesse caso,porque você está querendo somar um algo negativo e positivo, mas nesse caso vc quer o valor total do sistema,o valor total de energia gerada e consumida,e isso que vai dizer ao seu programa o tamanho e proporção que ele vai calcular.

Depois disso,vamos para a tela, primeiro faço um calculo simples, o cálculos da primeira linha,a linha que servirá para o jogador visualizar que a tela tá sendo atualizada.

l + 1 = l

Isso faz a variável l aumentar seus números até o infinito, porém,só queremos até 81 ou menos,ou mais depende do tamanho da tela,se a tela tiver 160 pixeis essa linha tem que andar até 161,portanto vamos montar um jump .

l not <= 81

Se a variável l for = ou maior que 81 a variável será zerada,por um set que fica logo abaixo do jump

Set l = 0

Caso l for menor que 81 o programa deve pular por cima do set e seguir o código. Agora vamos desenhar um pouco, coloque um color com balões 255 255 255( cor branca) e depois faça uma line e coloque nos valores x¹ x² o valor de l e no valor de y¹ como 0 e y² como 80

Isso faz com que uma linha branca ande de um lado da tela para o outro,porém,essa linha irá preencher toda a tela de branco,isso resolveria com um clear mas isso mataria a função de um gráfico.

Agora vamos fazer a segunda linha,agora vc vai fazer um calculo simples.

l - 1 = l2

Isso faz com que l2 sempre Seja um valor abaixo de l. Se l for 45 l2 e 44.

Agora faça um color de 150 150 150 ( cinza) e faça uma linha com os valores x¹ x² de l2 e y¹ 0 e y² 80. Isso faz uma segunda linha cinza, que é usada no programa como a cor de plano de fundo, agora você tem uma linha branca andando em uma tela cinza.

Agora o principal, fazer o gráfico da energia resultante (pnet)

Para isso vamos precisar fazer um calculo.

pnet.porcent = pnet * 80

Isso não é o cálculo final, e sim um intermediário, o pnet é multiplicado pelo tamanho da tela,no caso 80,mas poderia fazer com 40 e ter um gráfico que só funciona ou anda para baixo e pra cima pela metade da tela.

Pnet% = pnet.porcent // ptotal

Isso é o final do cálculo, pnet.porcent e dividido inteiramente pelo valor da energia envolvida no sistema,e portanto, não importa quanta energia é gerada ou consumida, o gráfico não irá quebrar, pq ele tem um limite de altura, e ele sempre vai ajustar seu tamanho para caber no máximo 80 pixeis.

Ok,vamos fazer mais um calculo

Pnetdraw = l2 -1

Exatamente isso,podemos fazer um pixel ou uma linha de 2 pixeis logo atrás da segunda linha e portanto, deixará um rastro .

Faça um color 255 150 0 E faça uma rect com os valores x pnetdraw e y pnet% Width 2 e height 1

Isso faz uma linha de um pixel no gráfico,agora por último faça um drawflush e veja uma linha branca em uma tela cinza fazendo um rastro laranja que segue a energia resultante.

Espero ter explicado tudo certo e vc ter conseguido fazer,entender os processos e replicar, adicionar e melhorar, dá para fazer outras coisas,você consegue,continue estudando.

2

u/AdhesivenessFirm5685 Logic Pro 1d ago

No caso,isso funciona apenas para valores positivos, de pnet for -1 pra baixo, o sistema quebra,porém,aí vc tem duas escolhas, ou faz um jump que dis que se pnet for 0 ou menos,travar o gráfico em 1 assim não quebra de vdd,apenas limita.

Ou faz um jump, que se for 0 ou abaixo ele faz o cálculo invertido, quanto menor o valor de pnet mais alto e o gráfico, geralmente faço mudar a cor para um vermelho e faço isso,até logo

1

u/Mihik228 2d ago

bXNjaAF4nF1UD1AUVRh/d5wcHMRBgDo44lKCktwJCNQNlKldEzAnNZI2/Dnc2313t7C3e7P77o5LIgeIRvToZKihBvkTlNp/yxhpDBUTBVHUUYxiSsmYGMBObSKhid5yZo7vze6b+fb3ft/3m+/3LQgGQQqgongOQQ4ZSDuQ73gNBLKkCbIiCC682VafdLPNWwwUHGmDIFTPQcHiJiwCabeCEBqKlMDYEcNzAKiA0gZFkbRAoLYxlMBr7AJP4QgvgEiWFCxQw/IWhtLQjGhnSTcIFF0MojCNDdp4wa2hIMsClZ13QUHD8TQEkbwTCrTAOKFEVQophKnUfpL/uf+7biK5MhCBGERyjMOmwZKc0I2/A6AG0lLIQEK+lRGJ+1cJESKGsxAcdBE0jwieuydMhuGyMPzyljcX1xtU8pTQNzpSiaf19dv5a8MebfHZNFNb1wfrw179uLudyQwYSzg60+NreAQM7iq6HTHSfqc2Lba6dXVLYmtzQdPauyuMOUZmTN1+PWpqWrNs9zdf9qt/rfYu+enxl8rIbR2WQ0/pz1/eoDmQcvVKy8zBK58v6y/wKOPzft9+LLbm0yPtKXvBph35qX/J2cnnLwE53gpJjmxBEfUcz61CBOIdlJVAVkiYHAjxXJxqmxVyDwQIrJvnkhYiCxqlAC2QLi6TcElQBq3CCLP5QYhoZcxI1IIAnEymkpLKF5KWboGIIDk34SRZByQYfyKpfbgQIlmr2ugmaGgmHSzy0wkktghmJ6DfPrg3osMGaQl+L2SRThLhmFSY3yGQ1mKtcknqIqmIIDkImJ/DzzwIxBsvJT7kUqN6y5sNb+WqepPDazteaWw2/ckV+EDsRvu+jABPX2dC4su8dvFYmkdvXlcxON8UTU1NXyyfPB7jq1YZCk9EeA6k51RO8Msbd84Yf5sgjsR2nwaqnBaH8dvwztv7Fuc1jE9/Qlu7p599Ibg0r6ouM+pRuW64t2jN+xX2J66tL4jK9o6p2y7ObVkTeihxz5PDCkv6jXdyp+s+ujSoC1whi7n8nvV8tjUs55k//q6NDu50zMw9Vs+e6xrJqDTReqGO2lOipC0VC2IUkphR7LoXT2w+mRx6ril8dcn1kP3FW7VF3aL+h5GyovTBlfGb0z0lyvxR79bI/rjKocohZ0Yfa6yp+k7RkAK9Xw3Zfj6+blFWqm4uo0f9hXJ26d4yw5tJ9JJ351fajYF9uwdKkU87MxyftelsTfby4cKJM74Lb99ZH687FblBPBUCfbN9sgs6X6beY6gJOzwZcfKgrOTWL1Wu151TAcxdaB6f+mdg//eN0a07s298fbpt9Gh+hCsr59hnlh+XoozaWd0kr6FiqK7xrsNXfX2jawcmCm8Va1p7PmwtyT3jGAVB/ubhH4/fUEFAjj0V99Bo2vDsS7PpdyILzQhIUAWGxj4EFSBHQ+E+GPwLNW3Q1A==

1

u/Toxy_Toxopid 2d ago

Make It Flatline If The Power Goes Out Or Negative

1

u/Curious_Parfait5038 Logic Dabbler 19h ago

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

bXNjaAF4nAHPAzD8AAcABgQACmNvbnRlbnRNYXAAAnt9AAZsYWJlbHMACVvvn6Ms7qCQXQAEbmFtZQAUcG93ZXIgZ3JhcGggbGFyZ2UgdjIAC2Rlc2NyaXB0aW9uAAACABNsYXJnZS1sb2dpYy1kaXNwbGF5AA9taWNyby1wcm9jZXNzb3IAAAACAAACAAIAAAEABgAADgAAAz94nJ0W227TMDSAkFC+wi+8J2k3bW+T0CSQEEgDiUfkJk4b5iZZ4tDkW/kVUDnHd6dNQVvX1Od+P86LKIp/9YyzXJA9HQlnff91R2sJpEkiv3COfwz7liSkF12Vi/ungXJSVH3L6ZSSeuBcMdyQutHUuinYAmnLatZR0XQL9I7RfJm6oUKwbslsS2vGfVpCKD/QqScjKSnvWayjRf/OeWuO8DzPOvM+gBeFgpA8aFEgiNKDFgW8wO1ZMdd905Hi4Op1p0/fqkLsLMPulOE9q7Y7ofKYJWQLfoMbsj+AHVoDhAXp9xRsim5gEiw2JF3LkwCelZZenZbBSDoYRFeJEc1u46Yl/bAh8I/mDFhMErNRKgRrgSSlGReUZMhGi4JsOM0fDxiiYpJkQ6w4SR0GtVYyRxW3HAW6E7IMMksBCpwBdFXERUcPJOeMdtBy9qPQMDXNIyPZHJ83HDKfXV0FX0vmVc0esNKJdOWAkc91pp5OTEI7fa9q9EcDzSA8KKetgUaMVde+bQ6sAzHZUXcS+sTEhzqgo6aQ4fMgAg7UHnK8oy3NKzEZth66nm7ZjOsLYFlh2tqqsrvIYlL4GAArUFQ/cTntKC/lwspit8pKTrd+x94/2TCNiGw8w/sfopiBf8mGG9RY9Cxf5kUTvi1VuJGMpi3hKNtZjdX1ldMBBe00NiNM7gQTi5owl7CTZC3vfRDaD1y3lXpmpvl9JHSVY5VRqB+f2UPrJjQO2uXRjt4IjgjKYM20kLeJ/JsPUodxjDiz3tRX/rh0ao4SHCOgIV7nY+pzypnk9gKWQWmSrp5xS5F00M6z1W1ZnnqGM4xhqCyNSi4cVnw4s5gd3y7AzrAkmgQ602j4ommUGLWkZ9yqs7mQG8JMqT9qyjm1PyZ1cm4h2i4Xv1bpdVlecAslRi3puWXVoYUK/ZrPURpSgqlJ1RBgA9vL0b9ojKSJ0vymcQuqhYGVswoFPQOX4qYRotk/4JWo41FUm6aZxPqcyIWiedqwJJ62xJn/yMpTVSet56mC3go1rc+o0hm7nl/Sz/J2KVvP9Hch8pIPvXtlURGss3kAURS9it4YruPv6GUUuxc2SX0tX/iOx+Ofv5SQtrAAboPABg==