/
vTech
/
FcApps
Обзор
Документация
Войти
/
vTech
/
FcApps
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/FcUI_Raster_Line.h
107 строк
2 KB
vTech
alpha_00
03 дек 2025, 17:45
03 дек 2025, 17:45
ab8382d
Код
Авторство
О чём код?
#ifndef _FCUI_RASTER_LINE_H_ #define _FCUI_RASTER_LINE_H_ #include "FcUI_Error.h" #include "FcUI_Setting.h" FCUIDEF void FcUI_Raster_Line_2t(uint8_t(*mImage)[4], size_t width, size_t height, ptrdiff_t x0, ptrdiff_t y0, ptrdiff_t x1, ptrdiff_t y1, const uint8_t mDefaultColor[4]); FCUIDEF size_t FcUI_Algo_Raster_line_Bresenham_numberPoints(ptrdiff_t x0, ptrdiff_t y0, ptrdiff_t x1, ptrdiff_t y1); FCUIDEF size_t FcUI_Algo_Raster_line_Bresenham_f(float (*pVertex)[2], size_t vertexLength, ptrdiff_t x0, ptrdiff_t y0, ptrdiff_t x1, ptrdiff_t y1); FCUIDEF void FcUI_Raster_Line_2t(uint8_t(*mImage)[4], size_t width, size_t height, ptrdiff_t x0, ptrdiff_t y0, ptrdiff_t x1, ptrdiff_t y1, const uint8_t mDefaultColor[4]) { ptrdiff_t mDy, mSx, mDx, mSy, mError, mTmp; size_t i, j; mSx = x0 < x1 ? 1 : -1; mSy = y0 < y1 ? 1 : -1; mDx = mSx * (x1 - x0); mDy = mSy * (y1 - y0); mError = mDx - mDy; while (!(x0 == x1 && y0 == y1)) { i = y0; j = x0; if ((i < height) && (j < width)) { j = i * width + j; mImage[j][0] = mDefaultColor[0]; mImage[j][1] = mDefaultColor[1]; mImage[j][2] = mDefaultColor[2]; mImage[j][3] = mDefaultColor[3]; } mTmp = 2 * mError; if (mTmp >= -mDy) { mError -= mDy; x0 += mSx; } if (mTmp <= mDx) { mError += mDx; y0 += mSy; } } } FCUIDEF size_t FcUI_Algo_Raster_line_Bresenham_numberPoints(ptrdiff_t x0, ptrdiff_t y0, ptrdiff_t x1, ptrdiff_t y1) { ptrdiff_t mDy, mSx, mDx, mSy, mError, mTmp, mCounter; size_t i, j; mCounter = 0; mSx = x0 < x1 ? 1 : -1; mSy = y0 < y1 ? 1 : -1; mDx = mSx * (x1 - x0); mDy = mSy * (y1 - y0); mError = mDx - mDy; while (!(x0 == x1 && y0 == y1)) { i = y0; j = x0; mCounter++; mTmp = 2 * mError; if (mTmp >= -mDy) { mError -= mDy; x0 += mSx; } if (mTmp <= mDx) { mError += mDx; y0 += mSy; } } return mCounter; } FCUIDEF size_t FcUI_Algo_Raster_line_Bresenham_f(float (*pVertex)[2], size_t vertexLength, ptrdiff_t x0, ptrdiff_t y0, ptrdiff_t x1, ptrdiff_t y1) { ptrdiff_t mDy, mSx, mDx, mSy, mError, mTmp; size_t id; id = 0; mSx = x0 < x1 ? 1 : -1; mSy = y0 < y1 ? 1 : -1; mDx = mSx * (x1 - x0); mDy = mSy * (y1 - y0); mError = mDx - mDy; while (!(x0 == x1 && y0 == y1)) { if (id < vertexLength) { pVertex[id][0] = x0; pVertex[id][1] = y0; } id++; mTmp = 2 * mError; if (mTmp >= -mDy) { mError -= mDy; x0 += mSx; } if (mTmp <= mDx) { mError += mDx; y0 += mSy; } } return id; } #endif //_FCUI_RASTER_LINE_H_