##Problem 1: Transforming Coordinates in 2D Cartesian System
#python
import numpy as np
def transform_point(x, y):
# Translation
tx, ty = 2, -1
x_translated = x + tx
y_translated = y + ty
# Rotation (90 degrees counterclockwise)
angle = np.radians(90)
cos_theta = np.cos(angle)
sin_theta = np.sin(angle)
x_rotated = x_translated * cos_theta - y_translated * sin_theta
y_rotated = x_translated * sin_theta + y_translated * cos_theta
# Scaling
sx, sy = 2, 2
x_scaled = x_rotated * sx
y_scaled = y_rotated * sy
return x_scaled, y_scaled
# Example point
x, y = 3, 4
x_transformed, y_transformed = transform_point(x, y)
print(f"Transformed point: ({x_transformed}, {y_transformed})")
##Problem 2: Converting Coordinates to Homogeneous Coordinates
#python
def convert_to_homogeneous(x, y):
return x, y, 1
# Example point
x, y = 3, 4
homogeneous_point = convert_to_homogeneous(x, y)
print(f"Homogeneous coordinates: {homogeneous_point}")
##Problem 3: Mapping Coordinates from World to View Coordinate System
#python
def world_to_view(x_world, y_world, z_world, camera_position):
x_camera, y_camera, z_camera = camera_position
x_view = x_world - x_camera
y_view = y_world - y_camera
z_view = z_world - z_camera
return x_view, y_view, z_view
# Example point and camera position
x_world, y_world, z_world = 2, 3, 4
camera_position = (0, 0, 0)
x_view, y_view, z_view = world_to_view(x_world, y_world, z_world, camera_position)
print(f"View coordinates: ({x_view}, {y_view}, {z_view})")
##Problem 4: Coordinate Mapping in Screen Space
#python
def ndc_to_screen(x_ndc, y_ndc, screen_width, screen_height):
x_screen = int((x_ndc + 1) / 2 * screen_width)
y_screen = int((1 - y_ndc) / 2 * screen_height)
return x_screen, y_screen
# Example NDC point and screen dimensions
x_ndc, y_ndc = -0.5, 0.5
screen_width, screen_height = 800, 600
x_screen, y_screen = ndc_to_screen(x_ndc, y_ndc, screen_width, screen_height)
print(f"Screen coordinates: ({x_screen}, {y_screen})")
##Problem 5: Perspective Projection in Homogeneous Coordinates
#python
def perspective_projection(x_world, y_world, z_world, focal_length, screen_width, screen_height):
# Convert to homogeneous coordinates
x_homogeneous, y_homogeneous, z_homogeneous, w_homogeneous = x_world, y_world, z_world, 1
# Apply perspective projection
f = focal_length
x_projected = x_homogeneous * f / z_homogeneous
y_projected = y_homogeneous * f / z_homogeneous
# Convert to NDC
x_ndc = x_projected / z_world
y_ndc = y_projected / z_world
# Map to screen coordinates
x_screen = int((x_ndc + 1) / 2 * screen_width)
y_screen = int((1 - y_ndc) / 2 * screen_height)
return x_screen, y_screen
# Example point and parameters
x_world, y_world, z_world = 3, 4, 5
focal_length = 2
screen_width, screen_height = 800, 600
x_screen, y_screen = perspective_projection(x_world, y_world, z_world, focal_length, screen_width, screen_height)
print(f"Screen coordinates after perspective projection: ({x_screen}, {y_screen})")
IyNQcm9ibGVtIDE6IFRyYW5zZm9ybWluZyBDb29yZGluYXRlcyBpbiAyRCBDYXJ0ZXNpYW4gU3lzdGVtCgojcHl0aG9uCmltcG9ydCBudW1weSBhcyBucAoKZGVmIHRyYW5zZm9ybV9wb2ludCh4LCB5KToKICAgICMgVHJhbnNsYXRpb24KICAgIHR4LCB0eSA9IDIsIC0xCiAgICB4X3RyYW5zbGF0ZWQgPSB4ICsgdHgKICAgIHlfdHJhbnNsYXRlZCA9IHkgKyB0eQoKICAgICMgUm90YXRpb24gKDkwIGRlZ3JlZXMgY291bnRlcmNsb2Nrd2lzZSkKICAgIGFuZ2xlID0gbnAucmFkaWFucyg5MCkKICAgIGNvc190aGV0YSA9IG5wLmNvcyhhbmdsZSkKICAgIHNpbl90aGV0YSA9IG5wLnNpbihhbmdsZSkKICAgIHhfcm90YXRlZCA9IHhfdHJhbnNsYXRlZCAqIGNvc190aGV0YSAtIHlfdHJhbnNsYXRlZCAqIHNpbl90aGV0YQogICAgeV9yb3RhdGVkID0geF90cmFuc2xhdGVkICogc2luX3RoZXRhICsgeV90cmFuc2xhdGVkICogY29zX3RoZXRhCgogICAgIyBTY2FsaW5nCiAgICBzeCwgc3kgPSAyLCAyCiAgICB4X3NjYWxlZCA9IHhfcm90YXRlZCAqIHN4CiAgICB5X3NjYWxlZCA9IHlfcm90YXRlZCAqIHN5CgogICAgcmV0dXJuIHhfc2NhbGVkLCB5X3NjYWxlZAoKIyBFeGFtcGxlIHBvaW50CngsIHkgPSAzLCA0CnhfdHJhbnNmb3JtZWQsIHlfdHJhbnNmb3JtZWQgPSB0cmFuc2Zvcm1fcG9pbnQoeCwgeSkKcHJpbnQoZiJUcmFuc2Zvcm1lZCBwb2ludDogKHt4X3RyYW5zZm9ybWVkfSwge3lfdHJhbnNmb3JtZWR9KSIpCgoKIyNQcm9ibGVtIDI6IENvbnZlcnRpbmcgQ29vcmRpbmF0ZXMgdG8gSG9tb2dlbmVvdXMgQ29vcmRpbmF0ZXMKCiNweXRob24KZGVmIGNvbnZlcnRfdG9faG9tb2dlbmVvdXMoeCwgeSk6CiAgICByZXR1cm4geCwgeSwgMQoKIyBFeGFtcGxlIHBvaW50CngsIHkgPSAzLCA0CmhvbW9nZW5lb3VzX3BvaW50ID0gY29udmVydF90b19ob21vZ2VuZW91cyh4LCB5KQpwcmludChmIkhvbW9nZW5lb3VzIGNvb3JkaW5hdGVzOiB7aG9tb2dlbmVvdXNfcG9pbnR9IikKCgojI1Byb2JsZW0gMzogTWFwcGluZyBDb29yZGluYXRlcyBmcm9tIFdvcmxkIHRvIFZpZXcgQ29vcmRpbmF0ZSBTeXN0ZW0KCiNweXRob24KZGVmIHdvcmxkX3RvX3ZpZXcoeF93b3JsZCwgeV93b3JsZCwgel93b3JsZCwgY2FtZXJhX3Bvc2l0aW9uKToKICAgIHhfY2FtZXJhLCB5X2NhbWVyYSwgel9jYW1lcmEgPSBjYW1lcmFfcG9zaXRpb24KICAgIHhfdmlldyA9IHhfd29ybGQgLSB4X2NhbWVyYQogICAgeV92aWV3ID0geV93b3JsZCAtIHlfY2FtZXJhCiAgICB6X3ZpZXcgPSB6X3dvcmxkIC0gel9jYW1lcmEKICAgIHJldHVybiB4X3ZpZXcsIHlfdmlldywgel92aWV3CgojIEV4YW1wbGUgcG9pbnQgYW5kIGNhbWVyYSBwb3NpdGlvbgp4X3dvcmxkLCB5X3dvcmxkLCB6X3dvcmxkID0gMiwgMywgNApjYW1lcmFfcG9zaXRpb24gPSAoMCwgMCwgMCkKeF92aWV3LCB5X3ZpZXcsIHpfdmlldyA9IHdvcmxkX3RvX3ZpZXcoeF93b3JsZCwgeV93b3JsZCwgel93b3JsZCwgY2FtZXJhX3Bvc2l0aW9uKQpwcmludChmIlZpZXcgY29vcmRpbmF0ZXM6ICh7eF92aWV3fSwge3lfdmlld30sIHt6X3ZpZXd9KSIpCgoKIyNQcm9ibGVtIDQ6IENvb3JkaW5hdGUgTWFwcGluZyBpbiBTY3JlZW4gU3BhY2UKCiNweXRob24KZGVmIG5kY190b19zY3JlZW4oeF9uZGMsIHlfbmRjLCBzY3JlZW5fd2lkdGgsIHNjcmVlbl9oZWlnaHQpOgogICAgeF9zY3JlZW4gPSBpbnQoKHhfbmRjICsgMSkgLyAyICogc2NyZWVuX3dpZHRoKQogICAgeV9zY3JlZW4gPSBpbnQoKDEgLSB5X25kYykgLyAyICogc2NyZWVuX2hlaWdodCkKICAgIHJldHVybiB4X3NjcmVlbiwgeV9zY3JlZW4KCiMgRXhhbXBsZSBOREMgcG9pbnQgYW5kIHNjcmVlbiBkaW1lbnNpb25zCnhfbmRjLCB5X25kYyA9IC0wLjUsIDAuNQpzY3JlZW5fd2lkdGgsIHNjcmVlbl9oZWlnaHQgPSA4MDAsIDYwMAp4X3NjcmVlbiwgeV9zY3JlZW4gPSBuZGNfdG9fc2NyZWVuKHhfbmRjLCB5X25kYywgc2NyZWVuX3dpZHRoLCBzY3JlZW5faGVpZ2h0KQpwcmludChmIlNjcmVlbiBjb29yZGluYXRlczogKHt4X3NjcmVlbn0sIHt5X3NjcmVlbn0pIikKCgojI1Byb2JsZW0gNTogUGVyc3BlY3RpdmUgUHJvamVjdGlvbiBpbiBIb21vZ2VuZW91cyBDb29yZGluYXRlcwoKI3B5dGhvbgpkZWYgcGVyc3BlY3RpdmVfcHJvamVjdGlvbih4X3dvcmxkLCB5X3dvcmxkLCB6X3dvcmxkLCBmb2NhbF9sZW5ndGgsIHNjcmVlbl93aWR0aCwgc2NyZWVuX2hlaWdodCk6CiAgICAjIENvbnZlcnQgdG8gaG9tb2dlbmVvdXMgY29vcmRpbmF0ZXMKICAgIHhfaG9tb2dlbmVvdXMsIHlfaG9tb2dlbmVvdXMsIHpfaG9tb2dlbmVvdXMsIHdfaG9tb2dlbmVvdXMgPSB4X3dvcmxkLCB5X3dvcmxkLCB6X3dvcmxkLCAxCgogICAgIyBBcHBseSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uCiAgICBmID0gZm9jYWxfbGVuZ3RoCiAgICB4X3Byb2plY3RlZCA9IHhfaG9tb2dlbmVvdXMgKiBmIC8gel9ob21vZ2VuZW91cwogICAgeV9wcm9qZWN0ZWQgPSB5X2hvbW9nZW5lb3VzICogZiAvIHpfaG9tb2dlbmVvdXMKCiAgICAjIENvbnZlcnQgdG8gTkRDCiAgICB4X25kYyA9IHhfcHJvamVjdGVkIC8gel93b3JsZAogICAgeV9uZGMgPSB5X3Byb2plY3RlZCAvIHpfd29ybGQKCiAgICAjIE1hcCB0byBzY3JlZW4gY29vcmRpbmF0ZXMKICAgIHhfc2NyZWVuID0gaW50KCh4X25kYyArIDEpIC8gMiAqIHNjcmVlbl93aWR0aCkKICAgIHlfc2NyZWVuID0gaW50KCgxIC0geV9uZGMpIC8gMiAqIHNjcmVlbl9oZWlnaHQpCiAgICByZXR1cm4geF9zY3JlZW4sIHlfc2NyZWVuCgojIEV4YW1wbGUgcG9pbnQgYW5kIHBhcmFtZXRlcnMKeF93b3JsZCwgeV93b3JsZCwgel93b3JsZCA9IDMsIDQsIDUKZm9jYWxfbGVuZ3RoID0gMgpzY3JlZW5fd2lkdGgsIHNjcmVlbl9oZWlnaHQgPSA4MDAsIDYwMAp4X3NjcmVlbiwgeV9zY3JlZW4gPSBwZXJzcGVjdGl2ZV9wcm9qZWN0aW9uKHhfd29ybGQsIHlfd29ybGQsIHpfd29ybGQsIGZvY2FsX2xlbmd0aCwgc2NyZWVuX3dpZHRoLCBzY3JlZW5faGVpZ2h0KQpwcmludChmIlNjcmVlbiBjb29yZGluYXRlcyBhZnRlciBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uOiAoe3hfc2NyZWVufSwge3lfc2NyZWVufSkiKQo=