{"id":18295253,"url":"https://github.com/andezion/factory","last_synced_at":"2025-04-09T08:27:24.540Z","repository":{"id":244827298,"uuid":"816386413","full_name":"Andezion/Factory","owner":"Andezion","description":"Небольшой проект демонстрирующий работу конвейера, двигая и изменяя элементы. ","archived":false,"fork":false,"pushed_at":"2024-07-15T09:21:19.000Z","size":33,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-15T02:42:25.233Z","etag":null,"topics":["conveyor","csharp","dotnet","oop","programming"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Andezion.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-17T16:34:08.000Z","updated_at":"2024-06-18T11:52:49.000Z","dependencies_parsed_at":"2024-07-15T11:13:22.811Z","dependency_job_id":null,"html_url":"https://github.com/Andezion/Factory","commit_stats":null,"previous_names":["andezion/factory"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Andezion%2FFactory","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Andezion%2FFactory/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Andezion%2FFactory/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Andezion%2FFactory/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Andezion","download_url":"https://codeload.github.com/Andezion/Factory/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248002123,"owners_count":21031526,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["conveyor","csharp","dotnet","oop","programming"],"created_at":"2024-11-05T14:34:12.242Z","updated_at":"2025-04-09T08:27:24.517Z","avatar_url":"https://github.com/Andezion.png","language":"C#","readme":"# Factory\nНебольшой проект демонстрирующий работу конвейера, двигая и изменяя элементы. \n## Table on contents\n* [General info](#general_info)\n* [Final result](#final_result)\n* [Features](#features)\n* [Technologies](#technologies)\n* [Setup](#setup)\n---\n## General info\nЭто обычный проект написанный с помощью C# и Google Forms, которые предоставляют нам удобный и понятный интерфейс, кнопки, и многие другие объекты. Так же я хотел всунуть сюда асинхронность, однако эта функция не работает корректно :) \n\n---\n## Final\n\nhttps://github.com/Andezion/Factory/assets/115638748/972d850b-8185-4db4-b35c-e69402435b76\n\n---\n## Features\nОсновная функция программы отвечающая за поворот прямоугольника-хватателя должна была быть реализована как асинхронная для задержки во время её исполнения, однако, к сожалению, она не работает корректно. Однако другие задачи функция исполняет корректно. \n\n```\nprivate async void DrawRotatedRectangle(Graphics g, Brush brush, float x1, float y1, float x2, float y2, float width, bool drawRedSquare, bool drawBlueSquare)\n{\n    double angle = Math.Atan2(y2 - y1, x2 - x1); // Угол наклона прямоугольника\n    float length = (float)Math.Sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); // Длина прямоугольника\n\n    float endX = x1 + length * (float)Math.Cos(angle);\n    float endY = y1 + length * (float)Math.Sin(angle);\n\n    g.TranslateTransform(x1, y1); // Перемещение к начальной точке\n    g.RotateTransform((float)(angle * 180 / Math.PI)); // Поворот координатной системы\n\n    // Рисование прямоугольника\n    g.DrawRectangle(p, -1, -width / 2 - 1, length + 1.5f, width + 1.5f);\n    g.FillRectangle(brush, 0, -width / 2, length, width);\n\n    // Логика появления квадратов\n    if (drawRedSquare)\n    {\n        if(endX == 160)\n        {\n            await Task.Delay(1000);\n        }\n        if(endX \u003c= 160)\n        {\n            g.FillRectangle(Brushes.Blue, length - 20 / 2 + 8, -20 / 2 - 2, 20 + 5, 20 + 5);\n        }\n        else\n        {\n            g.FillRectangle(Brushes.Red, length - 20 / 2 + 8, -20 / 2 - 2, 20 + 5, 20 + 5);\n        }\n    }\n\n    if (drawBlueSquare) \n    {\n        if(endX == 409)\n        {\n            await Task.Delay(1000);\n        }\n        if(endX \u003e= 409)\n        {\n            g.FillRectangle(Brushes.Green, length - 20 / 2 + 8, -20 / 2 - 2, 20 + 5, 20 + 5);\n        }\n        else\n        {\n            g.FillRectangle(Brushes.Red, length - 20 / 2 + 8, -20 / 2 - 2, 20 + 5, 20 + 5);\n        }\n    }\n\n    // Рисование квадратов на концах прямоугольников\n    float squareSize = 15;\n    g.DrawRectangle(p, length - squareSize / 2 + 7, -squareSize / 2 - 1, squareSize + 1.5f, squareSize + 1.5f);\n    g.FillRectangle(Brushes.Bisque, length - squareSize / 2 + 8, -squareSize / 2, squareSize, squareSize);\n\n    g.ResetTransform(); // Сброс трансформаций\n}\n```\nС течением времени - меняется угол поворота нашего прямоугольника. Каждую итерацию мы изменяем и пересчитываем новый угол и новые крайние точки нашего прямоугольника (движущаяся часть). Благодаря встроенным функция мы вращаем прямоугольник отталкиваясь от новыъ крайних точек. Так же с помощью простой логики - мы определяем должен ли появляться у прямоугольника сопутствующий квадрат. Удобность функции заключается в том, что мы можем добавить любой объект, и с лёгкостью прописать его движение. \n\nТак же получилось с легкостью реализовать движение конвейера и квадратов на нём всего-лишь в одном цикле.\n\n```\nfor (int i = 0; i \u003c linePositions.Count; i++)\n{\n    int pos = linePositions[i];\n    int nextPos = (i + 1 \u003c linePositions.Count) ? linePositions[i + 1] : conveyorHeight;\n\n    g.DrawLine(p, conveyorX, conveyorY + pos, conveyorX + conveyorWidth, conveyorY + pos);\n\n    if (conveyorY + pos + lineSpacing / 2 - squareSize / 2 \u003c 250)\n    {\n        g.FillRectangle(Brushes.Red, conveyorX + conveyorWidth / 2 - squareSize / 2, conveyorY + pos + lineSpacing / 2 - squareSize / 2, squareSize, squareSize);\n    }\n}\n```\n\nБлагодаря тому, что линии и квадраты у нас реализованы как массив - то в определённый момент мы просто показываем наши линии, попутно перемещая их вверх или вниз, благодаря чему создаётся впечатление движущегося конвейера. Положение квадратов считается в зависимости от расположения линий и показывается по такому же принципу как и линии. \n\nВозвращаясь к логике появления квадратов. Мы двигаемся от одного крайнего угла к другому, по ходу этого меняя некоторые булевский переменные.\n\n```\nif (temp_for_right)\n{\n    angle2 += speed;\n    if (angle2 \u003e= Math.PI)\n    {\n        temp_for_right = false;\n        rightRectangleSquareState = true; // Появление квадрата на 180 градусов\n    }\n}\nelse\n{\n    angle2 -= speed;\n    if (angle2 \u003c= Math.PI / 4)\n    {\n        temp_for_right = true;\n        rightRectangleSquareState = false; // Сбрасываем квадрат на 45 градусов\n    }\n}\n```\n\nБлагодаря такому ходу мы легко меняем направление и пересчитываем скорость в зависимости от направления. Так же тут прописана переменная для переноса квадрата.\n\n---\n## Technologies\nПроект сделан и использованием:\n* C# и Visual Studio 2022\n* Google Forms\n* Linus Torvalds tears \n---\n## Setup\nМожете просто установить последний релиз, если вы используете Линукс - тоже установите последний релиз. Если у вас Мак ОС - не устанавливайте последний релиз, пожалуйста. \n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandezion%2Ffactory","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandezion%2Ffactory","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandezion%2Ffactory/lists"}