Skip to content

Commit

Permalink
feat: إضافة قابلية تحديث موضع نقاط المستقيم الرئيسية
Browse files Browse the repository at this point in the history
  • Loading branch information
Assayyaad committed Aug 12, 2024
1 parent 5f89367 commit d4452cc
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 0 deletions.
42 changes: 42 additions & 0 deletions src/line/func/point.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/** @typedef {import('../options.js').Line} Line */
/** @typedef {import("../options.js").PosAssignOptions} PosAssignOptions */
/** @typedef {import("../imports.js").Point.Point} Point */

/**
Expand Down Expand Up @@ -57,3 +58,44 @@ export function move({ min, max, neg }, current, step, inverse = false) {
: // إذا كانت الحركة للأمام على مستقيم سالب أو للخلف على مستقيم موجب، تحرك خطوة بالسالب دون تجاوز القيمة الدنيا
Math.max(current - step, min)
}

/**
* يقوم بتحديث موضع الخط بناءً على القيمة والخيارات المعطاة
* @param {Line} line - كائن الخط الذي سيتم تحديثه
* @param {Point} value - القيمة التي سيتم تحديث الخط بها
* @param {PosAssignOptions} options - الخيارات لتعيين الموضع
* @returns {Line} - كائن الخط المحدّث
*/
export function updatePos(line, value, { type = 'to', target = 'both' }) {
if (target === 'end') {
// تحديث موضع النهاية فقط للخط
line.end = type === 'to' ? value : line.end + value
} else if (target === 'start') {
// تحديث موضع البداية فقط للخط
const temp = line.end
line.start = type === 'to' ? value : line.start + value
line.end = temp
} else if (target === 'both') {
// تحديث موضعي البداية والنهاية للخط
if (type === 'by') line.start = line.start + value
else if (type === 'to') {
line.start = value
line.end = value
}
}

return line // إرجاع كائن الخط المحدّث
}

/**
* يقوم بعكس موضعي البداية والنهاية للخط
* @param {Line} line - كائن الخط الذي سيتم عكسه
* @returns {Line} - كائن الخط المعكوس
*/
updatePos.flip = function (line) {
const temp = line.start // تخزين موضع البداية مؤقتاً
updatePos(line, line.end, { type: 'to', target: 'start' }) // تعيين موضع البداية إلى موضع النهاية
updatePos(line, temp, { type: 'to', target: 'end' }) // تعيين موضع النهاية إلى موضع البداية الأصلي

return line // إرجاع كائن الخط المعكوس
}
7 changes: 7 additions & 0 deletions src/line/options.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

export {}

/**
* خيارات تعيين الموضع
* @typedef {object} PosAssignOptions
* @property {'to' | 'by'} type - نوع تعيين الموضع
* @property {'start' | 'end' | 'both'} target - الهدف المراد تعيين موضعه
*/

/**
* خيارات إنشاء نقاط
*
Expand Down
57 changes: 57 additions & 0 deletions tests/line/func/point.js
Original file line number Diff line number Diff line change
Expand Up @@ -170,4 +170,61 @@ export default function () {
equal(a, 0)
})
})

describe('5: تحديث مواضع المستقيم', function () {
beforeEach(function () {
line = Line.create.one({ start: 0, end: 10 })
})

it('5.1: عكس مستقيم', function () {
// [0 -> 10] => [10 <- 0]

const a = Line.point.updatePos.flip(line)
equal(a.start, 10)
equal(a.end, 0)
})

it('5.2: تحديث موضع البداية فقط', function () {
// [0 -> 10] => [5 -> 10]

let a = Line.point.updatePos(line, 5, { type: 'by', target: 'start' })

equal(a.start, 5)
equal(a.end, 10)

// [5 -> 10] => [10 <- 20]

a = Line.point.updatePos(a, 20, { type: 'to', target: 'start' })
equal(a.start, 20)
equal(a.end, 10)
})

it('5.3: تحديث موضع النهاية فقط', function () {
// [0 -> 10] => [0 -> 15]

let a = Line.point.updatePos(line, 5, { type: 'by', target: 'end' })
equal(a.start, 0)
equal(a.end, 15)

// [0 -> 15] => [0 -> 20]

a = Line.point.updatePos(a, 20, { type: 'to', target: 'end' })
equal(a.start, 0)
equal(a.end, 20)
})

it('5.4: تحديث موضع البداية والنهاية معاً', function () {
// [0 -> 10] => [5 -> 15]

let a = Line.point.updatePos(line, 5, { type: 'by', target: 'both' })
equal(a.start, 5)
equal(a.end, 15)

// [5 -> 15] => [20 -> 20]

a = Line.point.updatePos(a, 20, { type: 'to', target: 'both' })
equal(a.start, 20)
equal(a.end, 20)
})
})
}

0 comments on commit d4452cc

Please sign in to comment.