Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
2 / 2 / 0
Регистрация: 27.06.2019
Сообщений: 1

Приложение, симулирующее дождевые капли

27.06.2019, 12:33. Показов 6879. Ответов 30

Студворк — интернет-сервис помощи студентам
Дело такое: я хочу написать программу, которая бы симулировала дождь. Равномерно по экрану я генерирую капли, которые затем должны падать вниз, но они не рисуются + они не падают. Я абсолютно без понятия, почему компьютер не рисует капли.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package Pack;
 
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
 
public class Runner {
    
    public static void createGUI() {
        JFrame f = new JFrame("Rain");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setPreferredSize(new Dimension(500, 500));
        f.setLocation(800, 100);
        f.setBackground(Color.lightGray);
        BackGroundPanel bg = new BackGroundPanel();
        bg.setLayout(null);
        f.add(bg);
        Drop[] drop = new Drop[100];
        for (int i = 0; i < drop.length; i++) {
            drop[i] = new Drop();
            bg.add(drop[i]);
            drop[i].fall();
        }
        
        f.pack();
        f.setVisible(true);
        
    }
        
    
    
    
    
    public static void main(String[] args) {
        System.out.println("Start");
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createGUI();
            }
        });
            
        }
            
    
    
}
 
 
public class BackGroundPanel extends JPanel {
     public BackGroundPanel() {
         setBackground(Color.lightGray);
    }
 
}
 
 
public class Drop extends JComponent{
    private int x, y, ySpeed;
    
    Drop(){
        x = new Random().nextInt(500);
        y = new Random().nextInt(500);
        ySpeed = new Random().nextInt(5) + 1;
    }
    
    void fall() {
        while(true) {
                y = y + ySpeed;
                if (y == 500) {
                   y = 0;
                  }
                   repaint();
                   try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    
                }
        }
         
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
         g.setColor(Color.BLUE);
         g.fillRect(10, 10, 10, 30);
     }
      
}
2
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.06.2019, 12:33
Ответы с готовыми решениями:

Заряд капли
К двум горизонтально размещенных плоских пластин, удаленных на расстояние 3 см друг от друга, приложено напряжение 300В. В электрическом...

Капли дождя
Здравствуйте!!! Помогите пожалуйста сделать на консольном окне капли дождя(то есть как льет дождь). Нужно чтобы они падали как на землю!!!...

Форма капли
помогите , дана программа написана в паскале нужно в турбо делфи переписать не получается..... вот код в паскале uses crt, ...

30
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
07.10.2019, 16:47
Студворк — интернет-сервис помощи студентам
я сама невинность что вы, я очень доверчив и раним. Когда уважаемый 8Observer8, сказал о своем маленьком 3д движке и как усердно он над ним работает я был искренне рад этому и мне стало интересно взглянуть на это, я ожидал увидеть хотя бы что то из подобного как на скрине. Но я увидел жалкие потуги море пафоса, я разбит и разочарован и проплакал всю ночь в подушку.
Миниатюры
Приложение, симулирующее дождевые капли  
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,138
Записей в блоге: 243
08.10.2019, 00:19
Цитата Сообщение от Nidl Посмотреть сообщение
Очень надеюсь что всетаки я смогу увидеть "Марио" из под вашего пера ну скажем хотя бы лет через 5
4 года назад я написал на C# и Untiy прототипы двух первых уровней Марио. Здесь можно попробовать поиграть, скачать исполняемый файл для разных платформ: Несколько небольших игрушек Вам удалось сделать играбельную демку Марио на чём-нибудь? Можете скинуть Exe? Только не скидывайте мне скриншоты и видео. Я хочу посмотреть производительность и функционал приложения.

Nidl, давайте подумаем, как более производительнее решить задачу темы. Может устроим соревнования, у кого получится решение производительнее в плане нагрузки на CPU? Я буду использовать традиционный подход, описанный в зарубежных учебниках по компьютерной графике, то есть шейдеры и GPU, а вы свой подход на CPU. Посмотрим у кого красивее получится.

Пока что я набросал программу выводящую изображения капель без анимации. Я использую C#, но программу несложно будет перевести на Java, потому что OpenGL на C#, Java, C++ - переводится очень просто. Я, для практики, написал эту часть с нуля, из головы, для дополнительной тренировки. Пишу в Visual Studio 2019, проект в архиве: Raindrops.zip. Когда сделаю анимацию движения, то скину Exe файл. Сделаю ещё кросспалтформенную версию в виде веб-приложения на WebGL и TypeScript. Не все же Windows используют. Есть и те у кого Mac или Linux.

Program.cs

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
namespace Raindrops
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var mainWindow = new MainWindow())
            {
                mainWindow.Run();
            }
        }
    }
}


MainWindow.cs

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
using OpenTK;
using OpenTK.Graphics.OpenGL;
using System;
using System.Diagnostics;
 
namespace Raindrops
{
    class MainWindow : GameWindow
    {
        private int _programId;
        private int _uModelMatrixLocation;
        private bool _canDraw = false;
 
        private const int _amountOfRainDrops = 10;
        private Vector2[] _positions = new Vector2[_amountOfRainDrops];
 
        public MainWindow(): base(256, 256, new OpenTK.Graphics.GraphicsMode(32, 24, 0, 4))
        {
            Random rnd = new Random();
 
            for (int i = 0; i < _amountOfRainDrops; i++)
            {
                _positions[i].X = rnd.Next(-10, 11) / 10f;
                _positions[i].Y = rnd.Next(-10, 11) / 10f;
            }
        }
 
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
 
            GL.ClearColor(0.803f, 0.917f, 0.870f, 1f);
 
            Title = "C#, OpenGL 3.1";
 
            var shaderProgram = new ShaderProgram(
                "Assets/Shaders/VertexShader.glsl",
                "Assets/Shaders/FragmentShader.glsl");
            _programId = shaderProgram.Id;
 
            if (!InitVertexBuffers()) return;
 
            _uModelMatrixLocation = GL.GetUniformLocation(_programId, "uModelMatrix");
            if (_uModelMatrixLocation == -1)
            {
                Debug.Assert(false, "Failed to get uModelMatrix");
                return;
            }
 
            if (!TextureManager.LoadTexture(_programId, "Assets/Textures/Raindrop_256x256.png")) return;
 
            _canDraw = true;
        }
 
        protected override void OnRenderFrame(FrameEventArgs e)
        {
            base.OnRenderFrame(e);
 
            GL.Viewport(0, 0, Width, Height);
            GL.Clear(ClearBufferMask.ColorBufferBit);
 
            if (_canDraw)
            {
                Draw();
            }
 
            SwapBuffers();
        }
 
        private void Draw()
        {
            for (int i = 0; i < _amountOfRainDrops; i++)
            {
                DrawRaindrop(_positions[i].X, _positions[i].Y);
            }
        }
 
        private void DrawRaindrop(float x, float y)
        {
            Matrix4 modelMatrix =
                Matrix4.CreateScale(0.5f) *
                Matrix4.CreateRotationZ(MathHelper.DegreesToRadians(0f)) *
                Matrix4.CreateTranslation(x, y, 0f);
            GL.UniformMatrix4(_uModelMatrixLocation, false, ref modelMatrix);
            GL.DrawArrays(PrimitiveType.Triangles, 0, 3);
        }
 
        private bool InitVertexBuffers()
        {
            float[] vertices = new float[]
            {
                -0.5f, -0.5f,
                0.5f, -0.5f,
                0f, 0.5f
            };
 
            float[] texCoords = new float[]
            {
                0f, 1f,
                1f, 1f,
                0.5f, 0f
            };
 
            if (!CreateVboAndLoadData(vertices, "aPosition")) return false;
            if (!CreateVboAndLoadData(texCoords, "aTexCoord")) return false;
 
            return true;
        }
 
        private bool CreateVboAndLoadData(float[] data, string attribute)
        {
            int vbo;
            GL.GenBuffers(1, out vbo);
 
            GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
            GL.BufferData(BufferTarget.ArrayBuffer, sizeof(float) * data.Length, data, BufferUsageHint.StaticDraw);
 
            int attributeLocation = GL.GetAttribLocation(_programId, attribute);
            if (attributeLocation == -1)
            {
                Debug.Assert(false, "Failed to get " + attribute);
                return false;
            }
 
            GL.VertexAttribPointer(attributeLocation, 2, VertexAttribPointerType.Float, false, 0, 0);
            GL.EnableVertexAttribArray(attributeLocation);
 
            return true;
        }
    }
}


ShaderProgram.cs

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using OpenTK.Graphics.OpenGL;
using System;
using System.Diagnostics;
using System.IO;
 
namespace Raindrops
{
    class ShaderProgram
    {
        public int Id { get; set; }
 
        public ShaderProgram(
            string vertexShaderPath, string fragmentShaderPath)
        {
            string vertexShaderSource = null;
            string fragmentShaderSource = null;
 
            try
            {
                vertexShaderSource = File.ReadAllText(vertexShaderPath);
                fragmentShaderSource = File.ReadAllText(fragmentShaderPath);
            }
            catch (Exception)
            {
                Debug.Assert(false, "Failed to get shader files");
                return;
            }
 
            int vShader = CreateShaderId(vertexShaderSource, ShaderType.VertexShader);
            int fShader = CreateShaderId(fragmentShaderSource, ShaderType.FragmentShader);
 
            Id = GL.CreateProgram();
            GL.AttachShader(Id, vShader);
            GL.AttachShader(Id, fShader);
            GL.LinkProgram(Id);
            GL.UseProgram(Id);
 
            int ok;
            GL.GetProgram(Id, GetProgramParameterName.LinkStatus, out ok);
            if (ok == 0)
            {
                string errorMessage = GL.GetProgramInfoLog(Id);
                Id = -1;
                Debug.Assert(false, errorMessage);
                return;
            }
        }
 
        private int CreateShaderId(string shaderSource, ShaderType shaderType)
        {
            int shader = GL.CreateShader(shaderType);
            GL.ShaderSource(shader, shaderSource);
            GL.CompileShader(shader);
 
            int ok;
            GL.GetShader(shader, ShaderParameter.CompileStatus, out ok);
            if (ok == 0)
            {
                string errorMessage = GL.GetShaderInfoLog(shader);
                Debug.Assert(false, errorMessage);
                return -1;
            }
 
            return shader;
        }
    }
}


TextureManager.cs

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using OpenTK.Graphics.OpenGL;
 
namespace Raindrops
{
    class TextureManager
    {
        public static bool LoadTexture(int program, string texturePath)
        {
            // Enable texture unit0
            GL.ActiveTexture(TextureUnit.Texture0);
 
            // Get the storage location of uSampler
            int uSamplerLocation = GL.GetUniformLocation(program, "uTexture0");
            if (uSamplerLocation < 0)
            {
                Debug.Assert(false, "Failed to get the storage location of uTexture0");
                return false;
            }
 
            // Set the texture unit 0 to the sampler
            GL.Uniform1(uSamplerLocation, 0);
 
            // Create the image object
            string fileName = texturePath;
            Bitmap image = null;
            try
            {
                image = new Bitmap(fileName);
            }
            catch (Exception)
            {
                Debug.Assert(false, "Cannot find the texture: " + fileName);
                return false;
            }
 
            GL.Enable(EnableCap.Blend);
            GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);
 
            // Create a texture object
            int texture = GL.GenTexture();
 
            // Bind the texture object to the target
            GL.BindTexture(TextureTarget.Texture2D, texture);
 
            // Set the texture parameters
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)All.Linear);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)All.ClampToEdge);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)All.ClampToEdge);
 
            BitmapData data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height),
                ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
 
            // Set the texture image
            GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, image.Width, image.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
 
            image.UnlockBits(data);
 
            return true;
        }
    }
}
Изображения
 
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
08.10.2019, 01:53
Цитата Сообщение от 8Observer8 Посмотреть сообщение
4 года назад я написал на C# и Untiy прототипы двух первых уровней Марио
На Unity сейчас каждый 3й школьник пишет, диалог именно о ваших наработках а не на использовании готовых редакторов по играм. Ведь этот диалог развился на дискуссию о своих разработках, вот вы вот простой редактор кода, компилятор и ваш ум и собственно все.

Игра с открытым миром что на видео exe я вам не дам, это уже как 3я часть одной вселенной и товар на itch. А из ранних поделок exe то конечно, конечно ночью трудно искать по полкам но вот например эти
Игра где играем за девчушку создана (flash developmer AS2) для одной девушки ученицы одной из украинское школы в году 2007-2008 точно не помню, сначала она на форуме попросила помочь с презентацией своего доклада потом как делать игры, конечно объяснять это глупо и я предложил ей что если она мне даст снимки всех этажей ее школы то за пару недель я сделаю для нее игру, а Gungala говорит что я злой я еще какой добрый бываю
Клон знаменитой игры где палим по курицам был сделан на AS3 как учебный процесс в году эдак 2009 вроде, проект предназначался для всеобщего обозрения как пример кодинга на свежем AS3.
Миниатюры
Приложение, симулирующее дождевые капли   Приложение, симулирующее дождевые капли  
Вложения
Тип файла: zip Desktop.zip (5.82 Мб, 1 просмотров)
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
08.10.2019, 01:59
Да и видео вы не смотрели, а продолжаете спорить, посмотрите мои уровень по играм что дальше было о чем беседовать, там голая математика и уж похлеще вашего марио на Unity. Когда посмотрите можно продолжить беседу а так все идет о том что я вас оскорбил унизил дернул за больное и бла бла бла. За сим кланяюсь и иду спать.
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,138
Записей в блоге: 243
08.10.2019, 04:13
Цитата Сообщение от Nidl Посмотреть сообщение
а продолжаете спорить, посмотрите мои уровень по играм что дальше было о чем беседовать
Вы неправильно поняли. Я не спорил. На своём движке я пока не могу сделать платформер типа Марио. Пока до этого не дочитал, так как прочитал, только до момента, как в движок добавить загрузку и отрисовку шрифтов на шейдерном OpenGL. Но в этой книге Build your own 2D Game Engine, как раз платформер. Я больше половины книги изучил. Книга очень интересная. Я вам очень благодарен, что вы зарядили меня мотивацией, к примеру, спровоцировали оформить книги в запись в блоге: Книги по математике в компьютерной графике для начинающих. А ещё я потренировался на каплях и для этого энергию дали опять же вы.

Я сделал анимацию. Код очень сырой. Можно задавать количество капель. Скорости у капель разные и генерируются случайным образом: Raindrops.zip

Вот EXE: Raindrops_Release.zip. В "Task Manager" пишет, что CPU = 0%
Изображения
 
0
531 / 180 / 39
Регистрация: 18.08.2012
Сообщений: 907
08.10.2019, 04:24
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Дело в том, что на русском нет книг для начинающих в компьютерной графике по математики, чтобы там так максимально просто объяснялось, как в книгах на английском.
Цитата Сообщение от Nidl Посмотреть сообщение
а что простых справочников по геометрии уже не достаточно ? У меня их 5 на полке стоит и как то хватает.
он просто старый популяризатор английского (тайный агент госдепа, не меньше)

что касается книг по компьютерной графике с формулами, с объяснениями и по-русски - то, есть замечательный
3-х томник по графике издательства Инфорком. 1992 года. Книги ориентированы ещё на zx spectrum но, математика и объяснения - применимы и по сей день.
такштэ...
на русском книг ЕСТЬ. И даже ещё и в те годы были.

Добавлено через 2 минуты
Цитата Сообщение от Nidl Посмотреть сообщение
Клон знаменитой игры где палим по курицам был сделан на AS3
а вот это, вот - вообще некрасиво. Таскать модельки, текстуры (наверно и что-то ещё... ) с оригинальной игры - это, наверно, только у нас в России на это могут смотреть на такое сквозь пальцы...
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,138
Записей в блоге: 243
08.10.2019, 05:18
Цитата Сообщение от sam063rus Посмотреть сообщение
что касается книг по компьютерной графике с формулами, с объяснениями и по-русски - то, есть замечательный
3-х томник по графике издательства Инфорком. 1992 года.
Я не спорю, даже в советское время были книги по машинной графике. Можно найти книги 60-х годов. Но я имел ввиду, книги по линейной алгебре в сочетании с новым шейдерным подходом. Шейдеры появились довольно таки недавно, в 2004. Поэтому и книги я рассматриваю после этой даты. Мне проще изучать, когда есть практические примеры на шейдерах (GLSL или HLSL - всё равно). А так можно одновременно два задачи решать: линейную алгебру изучать и английский. Я просто рассказываю про свой подход. Я не навязываю. Кому как нравится, пусть тот так и изучает. Мне в радость изучать линейную алгебру на английском.
0
531 / 180 / 39
Регистрация: 18.08.2012
Сообщений: 907
08.10.2019, 05:27
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Мне в радость изучать линейную алгебру на английском.
стесняюсь спросить...вы мазохист?
сколько вам лет? ведь с каждым годом, без живого общения - говорить на иностранном - всё тяжелее.
за себя могу сказать, что мой уровень изучения английского на уровне intermediate/upper Intermediate
и я бы не сказал, что я читаю и воспринимаю "линейную алгебру на английском" - с одинаковой или близкой к таковой скоростью по сравнению с русским текстом.
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,138
Записей в блоге: 243
08.10.2019, 07:35

Не по теме:

sam063rus, я вам в личку ответил, чтобы не засорять тему флудом.



Добавлено через 1 минуту
А, у вас личка закрыта.

Цитата Сообщение от sam063rus Посмотреть сообщение
стесняюсь спросить...вы мазохист?
Нет, я просто очень люблю английский. Мне очень нравится разговаривать по скайпу с англоговорящими.

Цитата Сообщение от sam063rus Посмотреть сообщение
сколько вам лет? ведь с каждым годом, без живого общения - говорить на иностранном - всё тяжелее.
Мне 32. Я больше 5 лет работаю принципиально только и иностранными заказчиками, тем и живу, то есть зарубежным фрилансем. Да, вы правы. Без живого общения английский очень быстро забывается. Нужно каждый день разговаривать с кем-нибудь не меньше 2 часов в день, желательно по видео связи, чтобы видеть человека.

Цитата Сообщение от sam063rus Посмотреть сообщение
за себя могу сказать, что мой уровень изучения английского на уровне intermediate/upper Intermediate
и я бы не сказал, что я читаю и воспринимаю "линейную алгебру на английском" - с одинаковой или близкой к таковой скоростью по сравнению с русским текстом.
Я сейчас читаю на английском быстрее, чем на русском. Я был левша. За 10 лет переучился писать быстро и красиво правой рукой на английском. Я года три принципиально не читаю и не смотрю ничего на русском, особенно, что-то долгое типа фильмов - только на английском. Книги на русском я все поудалял. Только на данном форуме пишу иногда, чтобы русский не забыть.

Добавлено через 1 час 47 минут
Модераторы. Закройте, пожалуйста, тему. Надоел этот бесконечный флуд, на который я вынужден отвечать.
0
531 / 180 / 39
Регистрация: 18.08.2012
Сообщений: 907
08.10.2019, 13:32
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Только на данном форуме пишу иногда, чтобы русский не забыть.
ок. спасибо за развёрнутый ответ. Извиняюсь, если чем обидел.
0
 Аватар для vvm28
773 / 541 / 67
Регистрация: 22.12.2013
Сообщений: 2,500
Записей в блоге: 26
08.10.2019, 14:50
Хватит уже всем оффтопить. Где ваш код дождя? Технологии можно обсуждать вечно. Где результат?

Добавлено через 29 минут
Вот нашел код дождя.
Его прислал ashakirov на Stackoverflow.

Но чем мне не очень нравится, так это то что все вычисления делаются в разных местах.
Можно ли код как-то рефакторить, чтобы вычисления делались где-то в одном месте?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
 import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class Main {
 
 public static void main( String [] args ) {
     JFrame frame = new JFrame();
     frame.setSize(800, 300);
     final RPanel rPanel=new RPanel();
     frame.add(rPanel);
     frame.setVisible( true );
     frame.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            super.windowClosing(e);
            rPanel.stop();
            System.exit(0);
        }
    });
}
}
 
class RPanel extends JPanel {
//*********SETTINGS****************************
private final float mWind = 2.05f;
private final float mGravity = 9.8f;
private final double mRainChance = 0.99; // from 0 to 1
 
private final int mRepaintTimeMS = 16;
private final float mRainWidth=1;
private final double mDdropInitialVelocity = 20;
private final double mDropDiam;
private final Color mColor=new Color(0, 0, 255);
//*********************************************
 
private final ArrayList<Rain> rainV;
private final ArrayList<Drop> dropV;
private final UpdateThread mUpdateThread;
 
public RPanel() {
    this.mDropDiam = 2;
    rainV = new ArrayList<>();
    dropV = new ArrayList<>();
 
    mUpdateThread=new UpdateThread();
    initRPanel();
}
private void initRPanel(){
mUpdateThread.start();
}
 
public void stop() {
    mUpdateThread.stopped=true;
}
 
@Override
public int getHeight() {
    return this.getSize().height;
}
 
@Override
public int getWidth() {
    return this.getSize().width;
}
 
private class UpdateThread extends Thread {
    public volatile boolean stopped=false;
    @Override
    public void run() {
        while (!stopped) {
            RPanel.this.repaint();
            try {
                Thread.sleep(mRepaintTimeMS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
 
@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setStroke(new BasicStroke(mRainWidth));
    g2.setColor(mColor);
 
    //DRAW DROPS
    Iterator<Drop> iterator2 = dropV.iterator();
    while (iterator2.hasNext()) {
        Drop drop = iterator2.next();
        drop.update();
        drop.draw(g2);
 
        if (drop.y >= getHeight()) {
            iterator2.remove();
        }
    }
 
    //DRAW RAIN
    Iterator<Rain> iterator = rainV.iterator();
    while (iterator.hasNext()) {
        Rain rain = iterator.next();
        rain.update();
        rain.draw(g2);
 
        if (rain.y >= getHeight()) {
            //create new drops (2-8)
            long dropCount = 1 + Math.round(Math.random() * 4);
            for (int i = 0; i < dropCount; i++) {
                dropV.add(new Drop(rain.x, getHeight()));
            }
            iterator.remove();
 
        }
    }
 
    //CREATE NEW RAIN
    if (Math.random() < mRainChance) {
        rainV.add(new Rain());
    } 
}
 
//*****************************************
class Rain {
    float x;
    float y;
    float prevX;
    float prevY;
 
    public Rain() {
        Random r = new Random();
        x = r.nextInt(getWidth());
        y = 0;
    }
 
    public void update() {
        prevX = x;
        prevY = y;
 
        x += mWind;
        y += mGravity;
    }
 
    public void draw(Graphics2D g2) {
        Line2D line = new Line2D.Double(x, y, prevX, prevY);
        g2.draw(line);
    }
}
 
//*****************************************
private class Drop {
 
    double x0;  
    double y0;  
    double v0; //initial velocity
    double t;  //time
    double angle;
    double x;
    double y;
 
    public Drop(double x0, double y0) {
        super();
        this.x0 = x0;
        this.y0 = y0;
 
        v0 = mDdropInitialVelocity;
        angle = Math.toRadians(Math.round(Math.random() * 180)); //from 0 - 180 degrees
    }
 
    private void update() {
        // double g=10;
        t += mRepaintTimeMS / 100f;
        x = x0 + v0 * t * Math.cos(angle);
        y = y0 - (v0 * t * Math.sin(angle) - mGravity * t * t / 2);
    }
 
    public void draw(Graphics2D g2) {
        Ellipse2D.Double circle = new Ellipse2D.Double(x, y, mDropDiam, mDropDiam);
        g2.fill(circle);
    }
}
}
Добавлено через 4 минуты
Например использовать интерфейсы. Тогда код улучшится и будет легче работать с многопоточностью.

Добавлено через 10 минут
Тут еще возникает вопрос о потокобезопасном использовании итераторов, в случае использования в разных потоках.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.10.2019, 14:50

Падение капли
Народ можете помочь с решением графической задачи в С++, нужно написать программу, моделирующую падение капли. Буду очень благодарен.

Потенциал капли
Потенциал капли (шара) ртути равняется 200В. Эта капля распадается на 1000 одинаковых маленьких капелек. Найти потенциал одной маленькой...

Замерзание капли воды
Здравствуйте! Есть следующие формулы: $$\frac{\partial T}{\partial t} = a \frac{\partial T}{\partial p} + a \frac{\partial ^2T}{\partial...

Найи объем капли
На двух одинаковых капельках масла находится по 100 лишних электронов. Сила электростатического отталкивания уравновешивается силой их...

Испарение капли воды в газе
Добрый день Тут попалась статья одна Козырев А.В., Ситников А.Г. &quot;Испарение сферической капли в газе среднего давления&quot;, хотел...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru